Python之collections模块

发布时间 2023-03-22 21:15:37作者: 中亿丰数字科技

简介

collections 是 python 的内置模块,提供了很多方便且高性能的关于集合的操作,掌握这些知识有助于提高代码的性能和可读性。

常用功能

计数器(Counter)
​ 双端队列(deque)
​ 默认字典(defaultdict)
​ 有序字典(OrderedDict)
​ 具名元组(namedtuple)

计数器(Counter)

res = 'RUN FAST, HIT FAST, WIN FAST'

统计字符串中所有字符的出现次数

传统写法

new_dict = {}for i in res:
    if i not in new_dict:
        new_dict[i] = 1
    else:
        new_dict[i] += 1print(new_dict)

 # {'R': 1, 'U': 1, 'N': 2, ' ': 5, 'F': 3, 'A': 3, 'S': 3, 'T': 4, ',': 2, 'H': 1, 'I': 2, 'W': 1}

Counter写法

from collections import Counter
r = Counter(res)print(r)        # Counter({' ': 5, 'T': 4, 'F': 3, 'A': 3, 'S': 3, 'N': 2, ',': 2, 'I': 2, 'R': 1, 'U': 1, 'H': 1, 'W': 1})print(r.get('F'))   # 5 可以当成字典使用

双端队列(deque)

队列

import queue
q = queue.Queue(3)  # 指定最大存放元素个数 3# 存放元素
q.put(111)
q.put(222)
q.put(333)# q.put(444)    # 如果队列满了 继续添加则原地等待 相当于一直等待不往下运行# 获取元素print(q.get())print(q.get())print(q.get())# print(q.get())  # 如果队列空了 继续获取则原地等待 相当于一直等待不往下运行

双端队列

from collections import deque
d = deque([1, 2, 3])
d.append(4)print(d)    # deque([1, 2, 3, 4])
d.appendleft(0)	# 从左加print(d)    # deque([0, 1, 2, 3, 4])
print(d.pop())  # 4  默认从右弹出元素print(d.popleft())  # 0  从左弹出元素

默认字典(defaultdict)

有如下值集合 [11,22,33,44,55,67,77,88,99],
将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。

普通字典

l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
new_dict = {'k1': [], 'k2': []}for i in l1:
    if i > 66:
        new_dict['k1'].append(i)
    else:
        new_dict['k2'].append(i)print(new_dict)    # {'k1': [77, 88, 99], 'k2': [11, 22, 33, 44, 55, 66]}

默认字典

from collections import defaultdict
l2 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
new_dict2 = defaultdict(list)   # 字典所有的值默认都是列表{'': [], '': []}for i in l2:
    if i > 66:
        new_dict2['k1'].append(i)
    else:
        new_dict2['k2'].append(i)print(new_dict2)    # defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99]})

有序字典(OrderedDict)

普通字典:内部是无序的

d1 = dict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])print(d1)  # {'k2': 'v2', 'k1': 'v1', 'k3': 'v3'}  # 内部无序 每次打印顺序都可能与上一次不同print(d1.keys())   # dict_keys(['k1', 'k2', 'k3'])

有序字典

from collections import OrderedDict
d2 = OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])print(d2)   # OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
d2['k1'] = 111print(d2)  # OrderedDict([('k1', 111), ('k2', 'v2'), ('k3', 'v3')])print(d2.keys())    # odict_keys(['k1', 'k2', 'k3'])

具名元组(namedtuple)

# 生成可以使用名字来访问元素内容的tuplefrom collections import namedtuple# 1.先产生一个元组对象模板
point = namedtuple('长宽高', 'x, y, z')# 2.创建数据
p1 = point('5cm', '1cm', '4cm')
p2 = point(7, 8, 9)print(p1, p2)       # 长宽高(x='5cm', y='1cm', z='4cm') 长宽高(x=7, y=8, z=9)print(p1.x)         # 5cmprint(p1.y)         # 1cm

作者:陈超