**输出**:
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}) dict_items([('a', 5), ('b', 4), ('c', 3), ('d', 2), ('e', 1)]) dict_keys(['a', 'b', 'c', 'd', 'e']) dict_values([5, 4, 3, 2, 1]) Counter({1: 4, 2: 3, 0: 2, 3: 2, 4: 1}) [(1, 4)] [(1, 4), (2, 3), (0, 2)] [0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4]
### namedtuple 命名元组
`namedtuple` 是很容易创建的,轻量级的对象类型。 它们给每个位置赋予了意义,并让代码更加易读。 它们可以在正常的元组使用的地方使用,并且添加了通过名称而不是索引来访问字段的能力。
代码:
from collections import namedtuple
创建一个具有类名为字符串和字段为字符串的 namedtuple
字段必须用逗号或空格分隔在给定的字符串中
Point = namedtuple('Point', 'x, y') # 创建一个元组的子类:Point。它的类名为 Point,它的字段为 x 和 y。 pt = Point(1, -4) print(pt) print(pt._fields) print(type(pt)) print(pt.x, pt.y) Person = namedtuple('Person', 'name, age') friend = Person(name='Tom', age=25) print(friend.name, friend.age)
**结果**:
Point(x=1, y=-4) ('x', 'y') <class 'main.Point'> 1 -4 Tom 25
### OrderedDict 有序字典
>
> python3.7以后不建议使用它了。因为python的内置dict已经支持顺序了。
>
>
>
OrderedDicts 是一个简单的字典,它记住插入项目的顺序。 当迭代一个有序字典时,其项目是按照它们的键被第一次添加的顺序返回。 如果新的项目覆盖了现有的项目,则原始插入位置仍然保持不变。 它们现在已经不再需要了,因为 dict
类型获得了能够记住插入顺序的能力(从 Python 3.7 开始)。 但是还有一些差异仍然存在,例如 OrderedDict 是设计用于重新排序操作的。
**代码**:
from collections import OrderedDict
ordinary_dict = {} ordinary_dict['a'] = 1 ordinary_dict['b'] = 2 ordinary_dict['c'] = 3 ordinary_dict['d'] = 4 ordinary_dict['e'] = 5
在 Python 3.7 之前是随机的
print(ordinary_dict) ordered_dict = OrderedDict() ordered_dict['a'] = 1 ordered_dict['b'] = 2 ordered_dict['c'] = 3 ordered_dict['d'] = 4 ordered_dict['e'] = 5 print(ordered_dict)
一些差异仍然存在,例如 OrderedDict 是设计用于重新排序操作的。
for k, v in ordinary_dict.items(): print(k, v)
结果:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]) a 1 b 2 c 3 d 4 e 5
### defaultdict 带默认值字典
`defaultdict` 是一个容器,它和普通的 `dict` 容器相似,但它只有在键不存在时才会设置默认值。 如果你不使用 `defaultdict`,你需要检查键是否存在,如果不存在,就设置它为你想要的值。
**代码**:
from collections import defaultdict
初始化为默认整数值,即 0
d = defaultdict(int) d['yellow'] = 1 d['blue'] = 2 print(d.items()) print(d['green'])
初始化为默认列表值,即空列表
d = defaultdict(list) s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 5)] for k, v in s: d[k].append(v) print(d.items()) print(d['green'])
**结果**:
dict_items([('yellow', 1), ('blue', 2)]) 0 dict_items([('yellow', [1, 3]), ('blue', [2, 4]), ('red', [5])]) []
### deque 双端队列
`deque` 是一个双端队列。 它可以用来在两端添加或删除元素。
`deque` 支持线程安全,内存效率高的在两端添加或删除元素,其执行时间为 **O(1)**。
`deque` 是一个更常用的栈和队列的衍生,其输入和输出只能在一端。
**代码**:
from collections import deque
d = deque()
append():将元素添加到右端
d.append('a') d.append('b') print(d)
appendleft(): 将元素添加到左端
d.appendleft('c') print(d)
pop():从右端删除并返回一个元素
print(d.pop()) print(d)
popleft(): 从左端删除并返回一个元素
print(d.popleft()) print(d)
clear(): 清空 deque
d.clear() print(d) d = deque(['a', 'b', 'c', 'd'])
在右端或左端添加一个序列
d.extend(['e', 'f', 'g']) d.extendleft(['h', 'i', 'j']) # 注意,'j' 现在在左端的位置 print(d)
count(x):返回 x 在 deque 中的个数
print(d.count('h'))
将 deque 向右旋转一位
d.rotate(1) print(d)
将 deque 向左旋转两位
d.rotate(-2) print(d)
**结果**:
deque(['a', 'b']) deque(['c', 'a', 'b']) b deque(['c', 'a']) c deque(['a']) deque([]) deque(['j', 'i', 'h', 'a', 'b', 'c', 'd', 'e', 'f', 'g']) 1 deque(['g', 'j', 'i', 'h', 'a', 'b', 'c', 'd', 'e', 'f']) deque(['i', 'h', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'j'])
### 小节
上面分享了神器`collections`模块的5大常用容器类型:
1. `Counter` 计数
2. `namedtuple` 命名元组
3. `OrderedDict` 有序字典
4. `defaultdict` 带默认值字典
5. `deque` 双端队列
熟练使用这些容器类型,在某些任务场景下将大幅提升编码效率!如对字符串的字符进行计数等。