在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、ChainMap、namedtuple和OrderedDict等。
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
6.ChainMap:把多个字典连起来,当成一个字典操作
一、namedtuple
tuple:元组不仅仅是不可变的列表
元组拆包:
# 元组拆包
a = (1, 2, 3, 4, 5)
*name, num = a #用* 处理不需要的元素
print(num)
tuple是不可变类型,例如,一个点的二维坐标就可以表示成:
p=(1,2)
但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。
这时,namedtuple
就派上了用场:
from collections import *
# namedtuple: 生成可以使用名字来访问元素内容的tuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p.x)
>>>1
二、defaultdict
有如下值集合 [
11
,
22
,
33
,
44
,
55
,
66
,
77
,
88
,
99
,
90.
..],将所有大于
66
的值保存至字典的第一个key中,将小于
66
的值保存至第二个key的值中。
使用dict:
values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
my_dict = {}
for value in values:
if value > 66:
if my_dict.get('k1'):
my_dict['k1'].append(value)
else:
my_dict['k1'] = [value]
else:
if my_dict.get('k2'):
my_dict['k2'].append(value)
else:
my_dict['k2'] = [value]
print(my_dict)
使用dict会存在一个问题,当key不存在的时候,会报错。
使用defaultdict:
from collections import defaultdict
values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
my_dict = defaultdict(list)
for value in values:
if value > 66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
print(my_dict)
key不存在时,不会报错,返回一个默认值。
三、deque
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
from collections import deque
q = deque([1,2,3,4,5]) # 传入可迭代对象,可用列表,字符串,元组
q.append('x')
q.appendleft('y')
print(q)
deque除了实现list的
append()
和pop()
外,还支持appendleft()
和popleft()
,这样就可以非常高效地往头部添加或删除元素。
四、Counter
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
from collections import Counter
# 统计每个文件中每个字符出现的次数
with open('test.txt', 'r') as f:
content = f.readline()
c = Counter(content)
print(c)
五、OrderedDict
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。如果要保持Key的顺序,可以用OrderedDict。
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d)
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
# print(od.pop('a')) #弹出a
od.move_to_end('a') # 把a放到最后
print(od)
六、ChainMap
把字典连起来,访问多个dict,像访问一个dict一样
from collections import ChainMap
# ChainMap
a = {'tian': 6}
b = {'chen': 'beauty'}
new_dict = ChainMap(a, b) # 把字典连起来,访问多个dict,像访问一个dict一样
print(new_dict.maps) #以列表格式输出
for key, value in new_dict.items(): # 进行遍历,重复的key只出现一次
print(key, value)