collections模块

python内置数据类型: str, int, tuple, dict
collections模块提供额外的数据类型:
1. namedtuple() : 可用用名字来访问元素内容的tuple 子类
2. deque: 双端队列,可以加快的从另一侧追加和推出对象
3. counter: 计数器
4. orderedDict: 有序字典
5. defaultdict: 有默认值的字典

namedtuple

import collections
# 给元组和元组中的每个元素起名字(元组是有序的,可以通过索引来取值)
from collections import namedtuple
persons = [('clerk',18),('octivia',20),('mephy',19)]
PERSON = namedtuple('person',['name','age'])  # 给元组起名字,并给每个元素起名字
for person in persons:
    person = PERSON._make(person)  # 结果产生一个对象
    print(person,type(person))
# 结果 person(name='clerk', age=18) 。。。

deque

double-ended queue 双端队列
# 优点: 实现从队列头部快速增加和取出对象 .popleft()   .appendleft() ----时间复杂度 o(1)
#        相当于 list 的 insert(0,v)  l.pop(0) ---- 时间复杂度 o(n)

d = deque([1,2,3,4])
print(d)
d.rotate(1)  # 把最后一个数字放在最前面deque([4, 1, 2, 3])
print(d)
d.rotate(2)  # 把最后两个数字放在前面deque([2, 3, 4, 1])
print(d)

# rotate 实现无线循环
import sys
import time
from collections import deque
fancy_loading = deque('>-----------')
while True:
  print('\r%s'%''.join(fancy_loading),fancy_loading.rotate(1),sys.stdout.flush(),time.sleep(0.08))

counter

from collections import Counter
s = '''A Counter is a 
dict subclass for counting
 hashable objects. It is an unordered 
 collection where elements are stored as 
 dictionary key
 '''
c = Counter(s)
# 出现频率最高的五个字符
letters = c.most_common(5)
print(letters)
# 结果[(' ', 24), ('e', 14), ('s', 10), ('o', 9), ('t', 9)]

ordereddict

from collections import OrderedDict
# 有序字典
items = (('a',1),('b',2),('c',3))
regular_dic = dict(items)
ordered_dic = OrderedDict(items)  #循环打印出来的key 是有序的

defaultdict

# 给dict 设置默认值,当key 不存在时返回默认值
# 默认值是调用函数产生的
from collections import defaultdict

def task():
    return 2
d = defaultdict(task)
d['k'] = 'aaa'
print(d['k'])   # 当key存在时,返回对应value
print(d['k2'])  # 当key 不存在时,调用task函数

ChainMap

# 合并字典,但不是真的合并,是在内部储存一个key到每一个字典的映射
a = {'a': 1, 'b': 2}
b = {'x': 3, 'y': 5}
a.update(b)
print(a)   # 合并两个字典,但是会改变a

# 不改变两个字典,得到一个新的合并后的字典
from collections import ChainMap

c = {'z':5,'y':6}
e = ChainMap(a,b,c)
print(e['y'])  # 有相同值,取第一个
# 新添加的值会放在第一个字典个中
# 有相同的值,取第一个,删第一个
posted on 2019-07-03 20:49  Afrafre  阅读(104)  评论(0编辑  收藏  举报