collections 模块----Python标准库,是数据结构常用模块
常用类型有:
计数器(Counter) dict的子类,计算可hash的对象;
双端队列(deque) 类似于list的容器,可以快速的在队列头部和尾部添加、删除元素;
默认字典(defaultdict) dict的子类,可以调用提供默认值的函数;
有序字典(OrderedDict) dict的子类,可以记住元素的添加顺序;
可命名元组(namedtuple) 可以创建包含名称的tuple;
1 #获取元素个数,返回字典 2 3 >>> from collections import Counter 4 >>> str='12312312312' 5 >>> Counter(str) 6 Counter({'1': 4, '2': 4, '3': 3}) 7 >>> dict(Counter(str)) 8 {'1': 4, '2': 4, '3': 3} 9 >>> l = [1,2,3,4,5] 10 >>> Counter(l) 11 Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 1}) 12 >>> d={'d':4,'e':2,'c':7} 13 >>> Counter(d) 14 Counter({'c': 7, 'd': 4, 'e': 2})
most_common(),返回一个列表,包含counter中n个最大数目的元素,如果忽略n或者为None,most_common()将会返回counter中的所有元素,元素有着相同数目的将会以任意顺序排列;
>>> Counter('what do you think you are good').most_common(3) [(' ', 6), ('o', 5), ('h', 2)]
subtract(),从一个可迭代对象中或者另一个映射(或counter)中,元素相减,类似于dict.update(),但是subtracts 数目而不是替换它们,输入和输出都有可能为0或者为负;
而update() 为相加
>>> c=Counter({'a':3,'b':4,'c':1,'d':-2}) >>> d=Counter({'a':1,'b':2,'c':3,'d':4}) >>> c.substract(d) >>> c Counter({'a': 2, 'b': 2, 'c': -2, 'd': -6})
namedtuple
是一个函数,它用来创建一个自定义的tuple
对象,并且规定了tuple
元素的个数,并可以用属性而不是索引来引用tuple
的某个元素。
这样一来,我们用namedtuple
可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。
# 命名元组 # from collections import namedtuple # # p = namedtuple('point', ['x', 'y']) # p1 = p(4,3) # p2 = p(3,4) # print(p1.x) # print(p2.y) # print(p(4,3)) # 双端队列
deque是栈和队列的一种广义实现,deque是"double-end queue"的简称;deque支持线程安全、有效内存地以近似O(1)的性能在deque的两端插入和删除元素,尽管list也支持相似的操作,但是它主要在固定长度操作上的优化,从而在pop(0)和insert(0,v)(会改变数据的位置和大小)上有O(n)的时间复杂度。
大部分列表的方法在这里也适用# from collections import deque # l = [1,2] # dq = deque(l) # dq.append(3) # 将3添加到dq的右侧; # dq.appendleft(0) # 添加到左侧 # dq.insert(4,5) # print(dq.pop()) # 移除和返回deque中最右侧的元素 # print(dq.popleft()) # 移除和返回deque中最左侧的元素, # print(dq) # dq.clear() # 清零,元素长度为0
# dq.count(2) # 返回元素的个数
# # 有序的字典 # from collections import OrderedDict # # od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) # print(od) # print(od['b']) # for i in od.items(): # print(i)
defaultdict
使用dict
时,如果引用的Key不存在,就会抛出KeyError
。如果希望key不存在时,返回一个默认值,就可以用defaultdict
:
注意默认值是调用函数返回的,而函数在创建defaultdict
对象时传入。
除了在Key不存在时返回默认值,defaultdict
的其他行为跟dict
是完全一样的。
# 默认字典 # from collections import defaultdict
# d = defaultdict(lambda : 0)
# print(d['a']) # 没有a这个键,返回0