转自本人旧博客
title: Collections
date: 2017-07-21 18:29:01
tags: python
categories: python内建模块
Collections是python内建的一个集合模块,提供了许多有用的集合类
提供的集合类
defaultdict
from collections import defaultdict
counter
- 计数器,可以针对某项数据进行计数
from collections import Counter
colours = (
('Yasoob', 'Yellow'),
('Ali', 'Blue'),
('Arham', 'Green'),
('Ali', 'Black'),
('Yasoob', 'Red'),
('Ahmed', 'Silver'),
)
favs = Counter(name for name, colour in colours)
print(favs)
输出:
Counter({
'Yasoob': 2,
'Ali': 2,
'Arham': 1,
'Ahmed': 1
})
deque
-
它提供了一个双端队列,可以从头或尾两端添加或删除元素
-
用法类型python的list
from collections import deque
d = deque()
d.append(‘1’)
d.append(‘2’)
d.append(‘3’)
print(len(d))
输出: 3
print(d[0])
输出: 1 -
可以从两端取出(pop)数据:
d = deque(range(5))
print(len(d))
输出: 5
d.popleft()
输出: 0
d.pop()
输出: 4
print(d)
输出: deque([1, 2, 3]) -
可以限制这个列表的大小,当超出你设定的限制时,数据会从对队列另一端被挤出去(pop)
d = deque(maxlen=30)
-
可以从任一端扩展这个队列中的数据:
d = deque([1,2,3,4,5])
d.extendleft([0])
d.extend([6,7,8])
print(d)
输出: deque([0, 1, 2, 3, 4, 5, 6, 7, 8])
namedtuple
元组
- 一个元组是一个不可变的列表,你可以存储一个数据的序列,它和命名元组(namedtuples)非常像,但有几个关键的不同。
- 主要相似点:
-
不能修改元组中的数据。
-
获取元组中的数据,需要使用整数作为索引:
man = (‘Ali’, 30)
print(man[0])
输出: Ali
-
命名元组
-
namedtuples: 把元组变成一个针对简单任务的容器。
-
可以像字典一样访问namedtuples
-
但namedtuples是不可变的。
from collections import namedtuple
Animal = namedtuple(‘Animal’, ‘name age type’)
perry = Animal(name=“perry”, age=31, type=“cat”)
print(perry)
输出: Animal(name=‘perry’, age=31, type=‘cat’)
print(perry.name)
输出: ‘perry’ -
上例中,元组名称是Animal,字段名称是’name’,‘age’和’type’。
-
-
namedtuple优点:
- 让你的元组变得自文档了。你只要看一眼就很容易理解代码是做什么的
- 你也不必使用整数索引来访问一个命名元组,这让你的代码更易于维护。
- namedtuple的每个实例没有对象字典,所以它们很轻量,与普通的元组比,并不需要更多的内存。这使得它们比字典更快。
-
可以将命名元祖转化为字典
from collections import namedtuple
Animal = namedtuple(‘Animal’, ‘name age type’)
perry = Animal(name=“Perry”, age=31, type=“cat”)
print(perry._asdict())
输出: OrderedDict([(‘name’, ‘Perry’), (‘age’, 31), (‘type’, ‘cat’)])
enum.Enum (Python 3.4+)
枚举对象