collections是Python内建的一个集合模块,提供了许多有用的集合类。
目录
1.namedtuple
namedtuple
是一个函数,它用来创建一个自定义的tuple
对象,并且规定了tuple
元素的个数,并可以用属性或者索引来引用tuple
的某个元素。
这样一来,我们用namedtuple
可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。同时,namedtuple生成的类型可以直接调用_asdict()方法转换成字典。
示例
from collections import namedtuple
Point = namedtuple('point',['x','y'])
p = Point(10,20)
print(p,p[0],p[1],p.x,p.y)
d = p._asdict()
print(d,d['x'],d['y'])
2.deque
deque就是双端队列,可以很方便的在头尾插入或者删除元素。(注意:创建双端队列时可以通过maxlen参数指定队列的容量,不指定的话默认可以无限增长)
append(...)
| 队列右端插入一个元素
|
| appendleft(...)
| 队列左端插入一个元素
|
| clear(...)
| 删除队列中所有元素
|
| copy(...)
| 复制该队列
|
| count(...)
| D.count(value) -> integer -- 统计某个元素出现次数
|
| extend(...)
| 用输入的迭代器元素扩展队列右边
|
| extendleft(...)
| 用输入的迭代器元素扩展队列左边
|
| index(...)
| D.index(value, [start, [stop]]) -> integer -- 查找某个元素第一次出现的位置,找不到会报错
|
| insert(...)
| D.insert(index, object) -- 在某个位置插入一个元素
|
| pop(...)
| 删除并且返回最右边元素
|
| popleft(...)
| 删除并且返回最左边元素
|
| remove(...)
| D.remove(value) -- 删除第一个等于该值的元素
|
| reverse(...)
| D.reverse() -- 反转队列
|
| rotate(...)
| 双端队列右移n步,默认为1;若n为负数,则左移
示例
from collections import namedtuple,deque
x = deque([3,4],maxlen=5) #创建容量为5的队列,内容为[3,4]的队列
x.extend([5]) #在队列右边扩展一个数5,此时队列变为[3,4,5]
x.extendleft([2,1]) #在队列左边扩展元素[1,2],此时队列变为[1,2,3,4,5];想想为什么不是extendleft([1,2])
print(x)
3.defaultdict
使用dict
时,如果引用的Key不存在,就会抛出KeyError
。如果希望key不存在时,返回一个默认值,就可以用defaultdict。
创建defaultdict时需要传给他一个默认参数,这个参数要求为函数(也可以是int,list等类型)或者lambda表达式,但不能直接传入一个值,建议用lambda表达式。
d = defaultdict(lambda:'0') #默认值为0
d['x'] = 10
print(d['x'],d['y'])
4.OrderedDict
使用dict
时,Key是无序的。在对dict
做迭代时,我们无法确定Key的顺序。OrderedDict
的Key会按照插入的顺序排列,不是Key本身排序。
OrderedDict
内部维护着一个根据键插入顺序排序的双向链表。每次当一个新的元素插入进来的时候, 它会被放到链表的尾部。对于一个已经存在的键的重复赋值不会改变键的顺序。
需要注意的是,一个 OrderedDict
的大小是一个普通字典的两倍,因为它内部维护着另外一个链表。 所以如果你要构建一个需要大量 OrderedDict
实例的数据结构的时候(比如读取 100,000 行 CSV 数据到一个 OrderedDict
列表中去), 那么你就得仔细权衡一下是否使用 OrderedDict
带来的好处要大过额外内存消耗的影响。
from collections import OrderedDict
od = OrderedDict([('a', 1), ('c', 2), ('b', 3)])
5.ChainMap
ChainMap
可以把一组dict
串起来并组成一个逻辑上的dict
。ChainMap
本身也是一个dict,但是查找的时候,会按照顺序在内部的dict依次查找。什么时候使用?我们需要在字典1中查询一个变量,如果找不到就去字典2里面查找等等这种情况
from collections import ChainMap
dict1 = {'color': 'red','user': 'guest'}
dict2 = {'color': 'blue','user': 'root'}
dict3 = {'color': 'black','user': 'admib'}
combined = ChainMap(dict1,dict2,dict3)
print(combined['color'])
print(combined['user'])
6.conuter
Counter
是一个简单的计数器,其实就是默认值为0的一个字典子类。例如,统计字符出现的个数:
from collections import Counter
c = Counter()
for ch in 'programming':
c[ch] = c[ch] + 1
print(c)
高级示例:
from collections import Counter
words = [
'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes',
'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around', 'the',
'eyes', "don't", 'look', 'around', 'the', 'eyes', 'look', 'into',
'my', 'eyes', "you're", 'under'
]
word_counts = Counter(words)
# 出现频率最高的3个单词
top_three = word_counts.most_common(3)
print(top_three)
# Outputs [('eyes', 8), ('the', 5), ('look', 4)]