您的当前位置:首页正文

第十九章 必会标准库模块 collections

来源:花图问答

必学标准库 collections

一、defaultdict

在创建字典时,对每个新的键都会指定一个默认值。

这个默认值的参数是一个函数,函数返回的值就会作为初始字典每个键的默认值。

# 1. 默认值是整数
from collections import defaultdict
dic_int = defaultdict(int)
print(dic_int)

dic_int['a'] ='hello'
result =dic_int['b']
print(result)
print(dic_int)

# 2. 默认值是列表
dic_list = defaultdict(list)
print(dic_val)

dic_list['disk_info'].append(1)
print(dic_list)

# 3. 默认值是字典
dic_dict = defaultdict(dict)
print(dic_val)

dic_dict['base_info'].update({"host_name": "dbserver1"})
base_info = dic_dict.get('base_info')
h_name = base_info.get('host_name')

print(h_name)

# 4. 默认值是自定义的值
def default_val():
    return "默认没有此 key"

dic_val = defaultdict(default_val)
print(dic_val)

dic_val['a']='hello'
ret = dic_val['b']
print(dic_val)

# 5. 也可以是匿名函数
dic_val = defaultdict(lambda: '默认没有此 key')

# 6. 不给传参,默认值则是 None
dic_none = defaultdict()


二、OrderDict 有序字典

有序字典 OrderDict() 会记住字典添加的顺序,然后按照原来添加时的相同顺序返回 。

from collections import OrderedDict
dic_order = OrderedDict([('M', 1),('Q', 2),
    ('A', 3)
])

for key in dic_order:
    print(key)

目前 Python3.x 的字典都是有序的,但不代表在 Python3.x 中 OrderDict 就和 dict()无差别了。 看下面的例子。

from collections import OrderedDict

d = OrderedDict()

d['a'] =1
d['b'] =2
d['c'] =3

print(d)

# OrderedDict([('a', 1), ('b', 2), ('c', 3)])
item = d.popitem()

print(item)  # ('c', 3)
print(d)     # OrderedDict([('a', 1), ('b', 2)])

d.move_to_end('a')
print(d)  # OrderedDict([('b', 2), ('a', 1)])

从以上示例中可以看出,OrderedDict 还提供了两个方法:

  1. popitem() 可以删除字典中的键值对儿,并且的大这个键值对儿,而默认的 dict 对象只提供了 pop() 方法,这个方法只能返回值。
  2. move_to_end('key') 可以指定某一个键值对儿放到整个字典的最后。


三、deque 双端队列

deque 具有栈和队列的特征。

可以从序列的任意一端添加和删除元素。

from collections import deque

dq = deque('hello')
left_result = dq.popleft()
right_result = dq.pop()
print(left_result)
print(right_result)


四、namedtuple 命名元组

from collections import namedtuple

Person = namedtuple('Person', ['name','age'])

p1 = Person("shark", 18)
print(p1.name)
print(p1.age)


五、Counter 计数器

li = ['hello','qf','yangge','qf','yangge','hello','qf','yangge']
c1 = Counter(li)

# 倒序
item1 = c1.most_common()

# 只输出次数大于 1 的
item2 = c1.most_common(1)

# 相加减
l2 = ("yangge","shark","xiguatian","yangge","shark","xiguatian")
c2 = Counter(l2)

c1 + c2
c1 - c2

# 交集 得到共有的
c1 & c2

# 并集 得到所有的
c1 | c2


六、ChainMap 把多个字典合并进行循环

1. 未使用 ChainMap

d1 = {'a': 1, 'b': 2}
d2 = {'c': 3, 'e': 4}

for k, v in d1.items():
    print(k, v)

for k, v in d2.items():
    print(k, v)

"""
a 1
b 2
c 3
e 4
"""

2.使用 ChainMap

键无重复

d1 = {'a': 1, 'b': 2}
d2 = {'c': 3, 'e': 4}

new_dic = ChainMap(d1,d2)
for k, v in new_dic.items():
    print(k, v)

"""
e 4
a 1
b 2
c 3
"""

创建的时候键有重复

d1 = {'a': 1, 'c': 2}
d2 = {'c': 3, 'e': 4}

new_dic = ChainMap(d1,d2)
for k, v in new_dic.items():
    print(k, v)

"""
e 4
c 2
a 1
"""

更新的时候 键有重复

d1 = {'a': 1, 'c': 2}
d2 = {'c': 3, 'e': 4}

new_dic = ChainMap(d1,d2)
for k, v in new_dic.items():
    print(k, v)
print('*' * 10)

new_dic.update({'c': 30})
for k, v in new_dic.items():
    print(k, v)

"""
e 4
c 2
a 1
**********
e 4
c 30
a 1
"""