容器collections
容器 python3.8 官网 (opens new window)
# collections 模块
from collections import Counter, deque, defaultdict, namedtuple, OrderedDict
# 这个模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择
1
2
3
2
3
# Counter
from collections import Counter
cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
cnt[word] += 1
print(cnt) # Counter({'blue': 3, 'red': 2, 'green': 1})
print(cnt['black']) # 0 ,key不存在 返回0
a = {}
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
if not a.get(word):
a[word] = 1
else:
a[word] += 1
print(a) # {'red': 2, 'blue': 3, 'green': 1}
c = Counter(a=4, b=2, c=0, d=-2)
# 返回一个迭代器,其中每个元素将重复出现计数值所指定次。 元素会按首次出现的顺序返回。 如果一个元素的计数值小于一,elements() 将会忽略它
print(list(c.elements())) # ['a', 'a', 'a', 'a', 'b', 'b']
# most_common([n]) 返回一个列表,其中包含 n 个最常见的元素及出现次数,按常见程度由高到低排序
# 如果 n 被省略或为 None,most_common() 将返回计数器中的 所有 元素。 计数值相等的元素按首次出现的顺序排序
print(c.most_common()) # [('a', 4), ('b', 2), ('c', 0), ('d', -2)]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# deque
from collections import deque
# class collections.deque([iterable[, maxlen]])
# 返回一个新的双向队列对象,从左到右初始化(用方法 append()) ,从 iterable (迭代对象) 数据创建。如果 iterable 没有指定,新队列为空。
# 虽然 list 对象也支持类似操作,不过这里优化了定长操作和 pop(0) 和 insert(0, v) 的开销。它们引起 O(n) 内存移动的操作,改变底层数据表达的大小和位置
# 如果 maxlen 没有指定或者是 None ,deques 可以增长到任意长度。否则,deque就限定到指定最大长度。
# 一旦限定长度的deque满了,当新项加入时,同样数量的项就从另一端弹出。
# 常用方法
d = deque(maxlen=3)
d.append(3)
d.append(2)
d.append(1)
d.append(4) # 添加 4 到右端 ,达到最大值后,从另外一端弹出多余的
print(d) # deque([2, 1, 4], maxlen=3)
d.appendleft(9) # 添加9到最左端,达到最大值后,从另外一端弹出多余的
print(d) # deque([9, 2, 1], maxlen=3)
print(d.count(0)) # 0,计算等于 0 的数量
# extend(iterable) , 扩展deque的右侧,通过添加iterable参数中的元素
# extendleft(iterable) , 扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加
# insert(i, x) ,在位置 i 插入 x ,如果插入会导致一个限长 deque 超出长度 maxlen 的话,就引发一个 IndexError
# pop() ,移去并且返回一个元素,deque 最右侧的那一个。 如果没有元素的话,就引发一个 IndexError
# popleft() ,移去并且返回一个元素,deque 最左侧的那一个。 如果没有元素的话,就引发 IndexError
# remove(value) ,移除找到的第一个 value。 如果没有的话就引发 ValueError
# reverse() ,将deque逆序排列。返回 None
# maxlen ,Deque的最大尺寸,如果没有限定的话就是 None
# clear() ,移除所有元素,使其长度为0
# copy() ,创建一份浅拷贝
# rotate(n=1) ,向右循环移动 n 步。 如果 n 是负数,就向左循环 ,
# 如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# defaultdict
from collections import defaultdict
# class collections.defaultdict([default_factory[, ...]])
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
print(sorted(d.items())) # [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
s = 'mississippi'
d = defaultdict(int)
for k in s:
d[k] += 1
print(sorted(d.items())) # [('i', 4), ('m', 1), ('p', 2), ('s', 4)]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# namedtuple
from collections import namedtuple
# namedtuple 命名元组的工厂函数
# collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)
print(p[0] + p[1]) # 33
print(p.x + p.y) # 33
x, y = p
print(x, y) # 11 22
print(p) # Point(x=11, y=22)
# 命名元组尤其有用于赋值 csv sqlite3 模块返回的元组
EmployeeRecord = namedtuple('EmployeeRecord', 'EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER')
import csv
for emp in map(EmployeeRecord._make, csv.reader(open("files/employees.csv", "r"))):
print(emp.FIRST_NAME, emp.PHONE_NUMBER)
# 除了继承元组的方法,命名元组还支持三个额外的方法和两个属性。为了防止字段名冲突,方法和属性以下划线开始
t = [9, 11]
p1 = Point._make(t)
print(p1) # Point(x=9, y=11)
# 在 3.1 版更改: 返回一个 OrderedDict 而不是 dict ,在 3.8 版更改: 返回一个常规 dict 而不是 OrderedDict
print(p1._asdict()) # {'x': 9, 'y': 11} ,返回一个新的 dict ,它将字段名称映射到它们对应的值
print(p1._replace(x=33)) # Point(x=33, y=11) ,返回一个新的命名元组实例,并将指定域替换为新的值
print(p1._fields) # ('x', 'y') ,字符串元组列出了字段名。用于提醒和从现有元组创建一个新的命名元组类型
print(getattr(p1, 'x')) # 9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# OrderedDict
from collections import OrderedDict
# OrderedDict 有序字典
# class collections.OrderedDict([items]) 返回一个 dict 子类的实例,它具有专门用于重新排列字典顺序的方法
# 有序词典就像常规词典一样,但有一些与排序操作相关的额外功能
# popitem(last=True) 有序字典的 popitem() 方法移除并返回一个 (key, value) 键值对。
# 如果 last 值为真,则按 LIFO 后进先出的顺序返回键值对,否则就按 FIFO 先进先出的顺序返回键值对
# move_to_end(key, last=True) 将现有 key 移动到有序字典的任一端。 如果 last 为真值(默认)则将元素移至末尾;
# 如果 last 为假值则将元素移至开头。如果 key 不存在则会触发 KeyError
# 相对于通常的映射方法,有序字典还另外提供了逆序迭代的支持,通过 reversed()
# OrderedDict 之间的相等测试是顺序敏感的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 容器的抽象基类
# collections.abc --- 容器的抽象基类
# 该模块定义了一些 抽象基类,它们可用于判断一个具体类是否具有某一特定的接口;例如,这个类是否可哈希,或其是否为映射类
1
2
3
2
3
上次更新: 2023/09/04, 18:39:45