Python内置库collections使用集锦

collections中有以下类

Class name Description
namedtuple 用于创建具有命名字段的元组子类的工厂函数
deque 类似列表的容器,两端都有快速追加和弹出
ChainMap 类似于dict的类,用于创建多个映射的单个视图
Counter 用于计算可哈希对象的dict子类
OrderedDict 记住元素添加顺序的dict子类
defaultdict dict子类调用工厂函数来提供缺失值
UserDict 包装字典对象以便于dict子类化
UserList 包装列表对象以便于列表子类化
UserString 包装字符串对象以便于字符串子类化

主要介绍除UserDict、UserList、和UserString的其他类使用方法。

namedtuple

示例

# 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对象。

deque

示例

# 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提供了方便的可以进行双端插入和中间插入的双端队列。

Chainmap

示例

# 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提供了将多个字典联合的方法,但其并不是生成一个对象,更像是一个对已经存在字典对象的引用(从删除部分可以看出来)。添加和删除只针对第一个字典进行操作,查询则是顺序查询,返回查询到的第一个结果。
由于不是创建新的对象,所以构造速度快,在仅需要使用合并后字典查询时非常有用。

Counter

示例

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提供了对一个可迭代对象计数的功能,构造一个字典返回其所有出现的内容和次数。

OrderedDict

示例

# 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输出一致。

defaultDict

示例

# 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])])
[]

你可能感兴趣的:(Python之禅)