命名元组
Python中提供了基础的不可变数据结构元组tuple,对元组元素的访问需通过索引来完成,对此需要熟记每个下标对应的具体含义。如果元素数量一多,要记清楚这些东西就会比较麻烦了,于是就出现了命名元组namedtuple
。
- 创建命名元组
可通过collections.namedtuple创建的命名元组(类)
以下语句创建了一个叫做Point的命名元组类,它拥有两个属性x,y。
collections.namedtuple("Point",["x","y"])
#----或以下写法也是可以的---
collections.namedtuple("Point","x y")
collections.namedtuple("Point","x,y")
将命名元组赋给一个变量
MyPoint = collections.namedtuple("Point","x,y")
新建的元组变量,它只是一个类,如果要创建它的实例,则需要像创建类实例一样调用它:
MyPoint = collections.namedtuple("Point", "x,y")
p1 = MyPoint(x=1, y=2)
# x元素,下标0, y元素,下标1
print(p1.x,p1.y)
print(p1[0],p1[1])
-
修改元素 修改元组的元素不能简单的使用p1.x = 1,需要调用成员函数 _replace(),它会返回一个包含新值的新实例。
p1 = p1._replace(x = 1) #将p1的x值从0换到1
双端队例
双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构。双端队列也拥有两端:队首(front)、队尾(rear),但与队列不同的是,插入操作在两端(队首和队尾)都可以进行,删除操作也一样。
-
标准库collections.deque 常用方法包含如下:
1、append():
从右端添加元素,与list相同2、appendleft():
从左端添加元素3、extend():
从右端逐个添加可迭代对象,与list相同,Python中的可迭代对象有:列表、元组、字典、字符串4、extendleft():
从左端逐个添加可迭代对象,Python中的可迭代对象有:列表、元组、字典、字符串5、pop():
移除列表中的一个元素(默认最右端的一个元素),并且返回该元素的值(与list同),如果没有元素,将会报出IndexError6.popleft():
移除列表中的一个元素(默认最左端的一个元素),并且返回该元素的值,如果没有元素,将会报出IndexError7、count():
统计队列中的元素个数(与list同)8、insert(index,obj):
在指定位置插入元素(与list同)9、rotate(n):
rotate(n), 从右侧反转n步,如果n为负数,则从左侧反转。
d.rotate(1) 等于 d.appendleft(d.pop())10、maxlen:
只读的属性,deque限定的最大长度,如果无,就返回None。
当限制长度的deque增加超过限制数的项时, 另一边的项会自动删除。11、remove():
移除第一次出现的元素,如果没有找到,报出ValueError12、clear()
将deque中的元素全部删除,最后长度为0 -
应用 - 回文算法
回文(palindrome)是正读反读都一样的单词或句子,是一种修辞方式和文字游戏。
madam
able was i ere i saw elba
# 中文
花非花
人人为我、我为人人
如果要实现一个 回文验证算法(验证一个给定的字符串是否为回文),使用Deque类将非常容易:将字符串存储到双端队列,同时取出首尾字符并比较是否相等,只要有一对字符不等,则该字符串不是回文;若全部相等,则该字符串为回文。具体代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def palchecker(aString):
chardeque = collections.deque(aString)
while len(chardeque) > 1:
first = chardeque.popleft()
last = chardeque.pop()
if first != last:
return False
return True
if __name__ == '__main__':
str1 = 'able was i ere i saw elba'
print('"%s" is%s palindrome' % (str1, '' if palchecker(str1) else ' not'))
str2 = u'人人为我、我为人人'
print(u'"%s"%s是回文' % (str2, u'' if palchecker(str2) else u'不'))
str3 = u"What's wrong 怎么啦"
print(u'"%s"%s是回文' % (str3, u'' if palchecker(str3) else u'不'))
计数器
可用计算器给可散列的对象计数,或者是当成多重集合来使用 。
多重集合就是集合里的元素可以出现多次1。
用法如下:
-
使用前导入
from collections import Counter
collections.Counter实例
counter = collections.Counter(['生物', '印记', '考古学家', '生物', '枣', '印记'])
logging.info('counter -> %s', counter)
counter.update(['化石', '果实', '枣', '生物'])
logging.info('counter -> %s', counter)
most = counter.most_common(2)
logging.info('most -> %s', most)
-
统计词频
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
result = {}
for color in colors:
if result.get(color)==None:
result[color]=1
else:
result[color]+=1
print (result)
#{'red': 2, 'blue': 3, 'green': 1}
判断是否包含某元素,可以转化为dict然后通过dict判断,Counter也带有函数可以判断
c = Counter(['eggs', 'ham'])
print(c)
#Counter({'eggs': 1, 'ham': 1})
c['bacon'] # 不存在就返回0
#0
-
删除元素
c['sausage'] = 0 # counter entry with a zero count
del c['sausage']
5.获得所有元素
c = Counter(a=4, b=2, c=0, d=-2)
print(c)
#Counter({'a': 4, 'b': 2, 'c': 0, 'd': -2})
list(c.elements())
#['a', 'a', 'a', 'a', 'b', 'b']
-
查看最常见出现的k个元素
Counter('abracadabra').most_common(3)
#[('a', 5), ('r', 2), ('b', 2)] -
Counter更新
c = Counter(a=3, b=1)
d = Counter(a=1, b=2)
c + d # 相加
#Counter({'a': 4, 'b': 3})
c - d # 相减,如果小于等于0,删去
#Counter({'a': 2})
c & d # 求最小
#Counter({'a': 1, 'b': 1})
c | d # 求最大
#Counter({'a': 3, 'b': 2})
字典
dict1={'Tom':93,'Jim':80,'Lily':100}
# 使用元组作为dict的key
dict2 = {(20, 30):'good', 30:'bad'}
# 创建包含3组key-value对的字典
vegetables = [('celery', 1.58), ('brocoli', 1.29), ('lettuce', 2.19)]
dict3 = dict(vegetables)
# 创建包含3组key-value对的字典
dict4 = dict(cars)