collections中有以下类
Class name | Description |
---|---|
namedtuple | 用于创建具有命名字段的元组子类的工厂函数 |
deque | 类似列表的容器,两端都有快速追加和弹出 |
ChainMap | 类似于dict的类,用于创建多个映射的单个视图 |
Counter | 用于计算可哈希对象的dict子类 |
OrderedDict | 记住元素添加顺序的dict子类 |
defaultdict | dict子类调用工厂函数来提供缺失值 |
UserDict | 包装字典对象以便于dict子类化 |
UserList | 包装列表对象以便于列表子类化 |
UserString | 包装字符串对象以便于字符串子类化 |
主要介绍除UserDict、UserList、和UserString的其他类使用方法。
示例
# example: namedtuple
Computer = collections.namedtuple('Computer', ['name', 'price'])
dell = Computer('Dell', 1)
hp = Computer('HP', 2)
print(dell)
print(hp.price)
输出
Computer(name='Dell', price=1)
2
namedtuple“声明”了有两个成员变量的类,其中一个成员为name,另外一个为price。并可以使用构造函数轻松创建Computer对象。
示例
# example: deque
Deque = collections.deque()
Deque.append(1)
Deque.append(2)
print(Deque)
Deque.appendleft(3)
print(Deque)
Deque.reverse()
print(Deque)
print('pop back', Deque.pop())
print('pop left', Deque.popleft())
print('deque left', Deque)
输出
deque([1, 2])
deque([3, 1, 2])
deque([2, 1, 3])
pop back 3
pop left 2
deque left deque([1])
deque提供了方便的可以进行双端插入和中间插入的双端队列。
示例
# example: Chainmap
dicta = {'a': 1, 'b': 2, 'd': 4}
dictb = {'b': 100, 'c': 3}
chainmap = collections.ChainMap(dicta, dictb)
print(chainmap)
print(chainmap['a'], chainmap['b'], chainmap['c'], chainmap['d'])
del chainmap['b']
print(chainmap['a'], chainmap['b'], chainmap['c'], chainmap['d'])
print(dicta)
输出
ChainMap({'a': 1, 'b': 2, 'd': 4}, {'b': 100, 'c': 3})
1 2 3 4
1 100 3 4
{'a': 1, 'd': 4}
Chainmap提供了将多个字典联合的方法,但其并不是生成一个对象,更像是一个对已经存在字典对象的引用(从删除部分可以看出来)。添加和删除只针对第一个字典进行操作,查询则是顺序查询,返回查询到的第一个结果。
由于不是创建新的对象,所以构造速度快,在仅需要使用合并后字典查询时非常有用。
示例
lista = [1, 2, 3, 4, 5, 1, 1, 2, 2, 3]
counter = collections.Counter(lista)
print(counter)
输出
Counter({1: 3, 2: 3, 3: 2, 4: 1, 5: 1})
Counter提供了对一个可迭代对象计数的功能,构造一个字典返回其所有出现的内容和次数。
示例
# example: OrderDict
ori_dict = {'d': 4, 'a': 1, 'z': 26, 'b': 2}
print(ori_dict)
od = collections.OrderedDict(ori_dict)
print(od)
od['d'] = 100
print(od)
输出
{'d': 4, 'a': 1, 'z': 26, 'b': 2}
OrderedDict([('d', 4), ('a', 1), ('z', 26), ('b', 2)])
OrderedDict([('d', 100), ('a', 1), ('z', 26), ('b', 2)])
OrderedDict在遍历的时候保证了插入时候的顺序,而普通的dict不保证如此。上例恰好普通的dict和OrderedDict输出一致。
示例
# example: defaultdict
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = collections.defaultdict(set)
for k, v in s:
d[k].add(v)
print(d.items())
print(d['green'])
输出
dict_items([('red', {1, 3}), ('blue', {2, 4})])
set()
在使用默认的dict时候,如果查询一个不存在的key,会出现KeyError,使用defaultdict会避免这种情况。但是需要在创建defaultdict的时候指定空键的返回类型,如set或者list。set使得键对应的值出现不会重复出现,list不保证这一点,见下例。
示例
# example: defaultdict
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = collections.defaultdict(list) # 更改初始化为list
for k, v in s:
d[k].append(v) # 注意改为append
print(d.items())
print(d['green'])
输出
dict_items([('red', [1, 3, 1]), ('blue', [2, 4, 4])])
[]