这是介绍collections模块的第二部分内容。
- deque
- counter
- ChainMap
1 deque
1.1 简介
deque是双端列表类,实现了对数据高效的插入和删除,我们都知道python中的list查找数据是非常快的,可是插入和删除数据是很慢的。deque提供了popleft,appendleft实现了高效的往头部插入和删除元素。
传入deque一个可迭代对象,得到一个双端列表
In [10]: q = deque()
In [11]: q = deque('1234')
In [12]: q
Out[12]: deque(['1', '2', '3', '4'])
相比于list原有的pop和append外增加了popleft,appendleft。实现了队列头部高效存储删除元素,使用list.insert(0,args),list.pop(0)时间复杂度是O(n)随数据量增加,耗时也相应增加,而deque.popleft 和deque.appendleft时间复杂度是O(1)
In [12]: q
Out[12]: deque(['1', '2', '3', '4'])
In [13]: q.append(5)
In [14]: q
Out[14]: deque(['1', '2', '3', '4', 5])
In [15]: q.pop()
Out[15]: 5
In [16]: q
Out[16]: deque(['1', '2', '3', '4'])
In [17]: q.popleft()
Out[17]: '1'
In [18]: q
Out[18]: deque(['2', '3', '4'])
In [19]: q.appendleft('a')
In [20]: q
Out[20]: deque(['a', '2', '3', '4'])
In [25]: q.extend('qwe')
In [26]: q
Out[26]: deque(['a', '2', '3', '4', 'q', 'w', 'e'])
In [27]: q.extendleft('qwe')
In [28]: q
Out[28]: deque(['e', 'w', 'q', 'a', '2', '3', '4', 'q', 'w', 'e'])
2 Counter
2.1 简介
Counter是一个相当实用的计数器类,是dict的子类,可以方便的利用Counter来进行简单的计数分析。
2.2 构建方式
可以传入可迭代对象,字典,关键字参数来构建Counter
In [31]: s = 'aaaaadddddssssssswwwwwwwwdddddddssklsjgre;gwfhwehfiusafha'
In [32]: c = Counter(s)
In [33]: c
Out[33]:
Counter({';': 1,
'a': 7,
'd': 12,
'e': 2,
'f': 3,
'g': 2,
'h': 3,
'i': 1,
'j': 1,
'k': 1,
'l': 1,
'r': 1,
's': 11,
'u': 1,
'w': 10})
In [35]: c1
Out[35]: Counter()
In [36]: c2 = Counter({"a":"1","b":"2"})
In [37]: c2
Out[37]: Counter({'a': '1', 'b': '2'})
In [38]: c3 = Counter(a=1,b=2,c=3)
In [39]: c3
Out[39]: Counter({'a': 1, 'b': 2, 'c': 3})
2.2实用方法
Counter得到的对象是以键值对的方式来组织,键是元素,值是元素出现的数量,可以查看具体元素的数量,没有的元素是0
In [40]: c['a']
Out[40]: 7
In [41]: c[1]
Out[41]: 0
In [42]: c['d']
Out[42]: 12
查询出现频次较高的元素
In [66]: c.most_common()
Out[66]:
[('d', 12),
('s', 11),
('w', 10),
('a', 7),
('h', 3),
('f', 3),
('g', 2),
('e', 2),
('k', 1),
('r', 1),
('l', 1),
('i', 1),
('j', 1),
('u', 1),
(';', 1)]
In [67]: c.most_common(5)
Out[67]: [('d', 12), ('s', 11), ('w', 10), ('a', 7), ('h', 3)]
3 ChainMap
3.1 简介
ChainMap是python3的新特性,它用来将多个map组成一个新的单元(原来的map结构仍然存在,类似于这些map被存在了一个list之中),这比新建一个map再将其他map用update加进来快得多。通过ChainMap可以来模拟嵌套的情景,而且多用于模板之中。
In [76]: m1 = dict(name='chao')
In [77]: m2 = dict(age=23,hobby='python')
In [78]: m = ChainMap(m1,m2)
In [79]: m
Out[79]: ChainMap({'name': 'chao'}, {'age': 23, 'hobby': 'python'})
获取map中的元素
In [80]: m.get('name')
Out[80]: 'chao'
In [81]: m['age']
Out[81]: 23
新增,返回一个新的ChainMap对象
In [85]: m.new_child(m3)
Out[85]: ChainMap({'data': '1-6'}, {'name': 'chao'}, {'age': 23, 'hobby': 'python'})
ChainMap.parents ChainMap.maps
In [86]: m.parents
Out[86]: ChainMap({'age': 23, 'hobby': 'python'})
In [87]: m.maps
Out[87]: [{'name': 'chao'}, {'age': 23, 'hobby': 'python'}]