二十九、深入Python中的collections模块
「@Author: Runsen」
collections模块是一个不用不知道 , 一用就上瘾的模块 。 这里主要介绍OrderedDict类、defaultdict类、Counter类、namedtuple类和deque类 。
collectionscollections的常用类型有:
- 计数器(Counter)
- 双向队列(deque)
- 默认字典(defaultdict)
- 有序字典(OrderedDict)
- 可命名元组(namedtuple)
【二十九、深入Python中的collections模块】Counter是对字典类型的补充 , 用于追踪值得出现次数。
import collectionscounter = collections.Counter("My name is Runsen")print(counter)
输出如下Counter({' ': 3, 'n': 3, 'e': 2, 's': 2, 'M': 1, 'y': 1, 'a': 1, 'm': 1, 'i': 1, 'R': 1, 'u': 1})
取得元素重复次数的值print(counter[' '])3
elements()取得计数器中的所有元素 。注:此处非所有元素集合 , 而是包含所有元素集合的迭代器.
counter = collections.Counter('abcabcabcdabcdef') print(counter)# 输出如下Counter({'a': 4, 'b': 4, 'c': 4, 'd': 2, 'e': 1, 'f': 1})print(counter.elements())# 输出如下print(list(counter.elements()))# 输出如下['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd', 'd', 'e', 'f']
将Counter按照value从大到小排列 , 获取前N个元素 , 需要使用函数most_common# most_common(N)数量从大到小排列 , 获取前N个元素 print(counter.most_common(3))# 输出如下[('a', 4), ('b', 4), ('c', 4)]
sorted将Counter中的key进行排序 , 返回的是所有key的列表# sorted()列出所有不同的元素并排序 print(sorted(counter))# 输出如下['a', 'b', 'c', 'd', 'e', 'f']
将Counter转换成字符串 , 字符串的join方法可以解决 。 注意不是原来的模样 。# 转换成字符串 print(''.join(counter.elements()))# aaaabbbbccccddefprint(''.join(list(counter.elements())))
update()更新计数器 , 其实在原本的counter更新计数器,如果原来没有 , 则新建key , 如果有value则加一# update()更新计数器 , d = collections.Counter('a') counter.update(d) print(counter) # 输出如下Counter({'a': 5, 'b': 4, 'c': 4, 'd': 2, 'e': 1, 'f': 1})
update()更新计数器 , 那么subtract()相减计数器的values , 即原来的计数器中的每一个元素的数量减去后添加的元素的数量counter.subtract('abdabcabcg') print(counter)# 输出如下Counter({'a': 2, 'c': 2, 'b': 1, 'd': 1, 'e': 1, 'f': 1, 'g': -1})
dequedeque支持从任意一端增加和删除元素 。 更为常用的两种结构 , 就是栈和队列 。deque的常见操作
#定义一个空的双向队列d = collections.deque()#从右端增加元素d.extend("Runsen") d.append("Maoli")d.append("Python")d.append("king")#从左端增加元素d.appendleft('left')print(d)# 输出如下 (注意:extend和append的区别)deque(['left', 'R', 'u', 'n', 's', 'e', 'n', 'Maoli', 'Python', 'king'])# reverse()反转队列 print(d.reverse())d.reverse()print(d)# 输出如下Nonedeque(['king', 'Python', 'Maoli', 'n', 'e', 's', 'n', 'u', 'R', 'left'])d.reverse()d.extend(['qq','ww','ee']) print(d) # deque(['left', 'R', 'u', 'n', 's', 'e', 'n', 'Maoli', 'Python', 'king', 'qq', 'ww', 'ee'])# count()计数 print(d.count('R'))# 输出如下1# clear()清空队列 d.clear() print(d) # 输出如下deque([])# index()取得元素下标 print(d.index('Maoli'))# 输出如下7# insert()指定位置插入元素 d.insert(1,'Runsen') print(d) # deque(['left', 'Runsen',R', 'u', 'n', 's', 'e', 'n', 'Maoli', 'Python', 'king', 'qq', 'ww', 'ee'])
OrderedDict使用dict时要保持Key的顺序 , 可以用OrderedDict 。from collections import OrderedDict dic = OrderedDict() dic['k1'] = 'v1' dic['k2'] = 'v2' dic['k3'] = 'v3' print(dic) # 输出如下OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])# 字典所有的键 print(dic.keys())# 输出如下odict_keys(['k1', 'k2', 'k3'])# 字典所有值 print(dic.values())# 输出如下odict_values(['v1', 'v2', 'v3'])# items() 方法以列表返回可遍历的(键, 值) 元组数组 print(dic.items())# 输出如下odict_items([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])#pop()方法 , 删除指定的键值 dic.pop('k1')print(dic) # 输出如下OrderedDict([('k2', 'v2'), ('k3', 'v3')])#popitem()方法 , 默认删除字典最后一个元素 dic.popitem() print(dic) # 输出如下OrderedDict([('k2', 'v2')])# update()更新字典 dic.update({'k1':'v1111','k10':'v10'}) print(dic) # 输出如下OrderedDict([('k2', 'v2'), ('k1', 'v1111'), ('k10', 'v10')])
OrderedDict和字典操作完全相同 , 区别在于OrderedDict的Key会按照插入的顺序排列 , 不是Key本身排序>>> from collections import OrderedDict>>> d = dict([('a', 1), ('b', 2), ('c', 3)])>>> d # dict的Key是无序的{'a': 1, 'c': 3, 'b': 2}>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])>>> od # OrderedDict的Key是有序的OrderedDict([('a', 1), ('b', 2), ('c', 3)])
- 空调|让格力、海尔都担忧,中国取暖“新潮物”强势来袭,空调将成闲置品?
- 占营收|华为值多少钱
- 俄罗斯手机市场|被三星、小米击败,华为手机在俄罗斯排名跌至第三!
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 操盘|中兴统一操盘中兴、努比亚、红魔三大品牌
- 印度|拒绝华为后,印度、英国斥资数十亿求助日本
- 华为|台积电、高通、华为、小米接连宣布!美科技界炸锅:怎么会这样!
- 拍照|iPhone12还没捂热13就曝光了,屏幕、信号、拍照均有升级!
- 路由器|家里无线网经常断网、网速慢怎么办?教你几个小窍门,轻松解决
- 一图看懂!数字日照、新型智慧城市这样建(上篇)|政策解读 | 新型