Collections模块

collections的常用类型有:
计数器(Counter)
双向队列(deque)
默认字典(defaultdict)
有序字典(OrderedDict)
可命名元组(namedtuple)
使用以上类型时需要导入模块 from collections import *

Counter计数器

Counter 作为字典(dict)的一个子类用来进行hashtable计数,将元素进行数量统计、计数后返回一个字典,键值为元素:值为元素个数

1
2
3
4
5
6
7
8
9
10
from collections import Counter

s = 'abcbcaccbbad'
l = ['a', 'b', 'c', 'c', 'a', 'b', 'b']
d = {'2': 3, '3': 2, '17': 2}

# Counter 获取各元素的个数,返回字典
print(Counter(s)) # Counter({'c': 4, 'b': 4, 'a': 3})
print(Counter(l)) # Counter({'b': 3, 'a': 2, 'c': 2})
print(Counter(d)) # Counter({3: 3, 2: 2, 17: 1})

most_common(int) 按照元素出现的次数进行从高到低的排序,返回前int个元素的字典

1
2
3
4
5
from collections import Counter

m1 = Counter('abcbcaccbbad')
print(m1) # Counter({'c': 4, 'b': 4, 'a': 3, 'd': 1})
print(m1.most_common(3)) # [('c', 4), ('b', 4), ('a', 3)]

elements 返回经过计数器Counter后的元素,返回的是一个迭代器

1
2
3
4
5
6
7
8
from collections import Counter

e1 = Counter('abcbcaccbbad')
print(e1.elements()) # <itertools.chain object at 0x0000000002249828>
print(''.join(sorted(e1.elements()))) # aaabbbbcccc

e2 = Counter({'2': 3, '3': 2, '17': 2})
print(sorted(e2.elements())) # ['17', '17', '2', '2', '2', '3', '3'] 字典返回value个key

update

和set集合的update一样,对集合进行并集更新

1
2
3
4
5
from collections import Counter

u1 = Counter('abcbcaccbbad')
u1.update('123a')
print(u1) # Counter({'a': 4, 'c': 4, 'b': 4, '1': 1, '3': 1, '2': 1})

substract

和update类似,只是update是做加法,substract做减法,从另一个集合中减去本集合的元素

1
2
3
4
5
6
7
8
from collections import Counter

sub1 = 'which'
sub2 = 'whatw'
subset = Counter(sub1)
print(subset) # Counter({'h': 2, 'i': 1, 'c': 1, 'w': 1})
subset.subtract(Counter(sub2))
print(subset) # Counter({'c': 1, 'i': 1, 'h': 1, 'a': -1, 't': -1, 'w': -1}) sub1中的h变为2,sub2中h为1,减完以后为1

iteritems

与字典dict的items类似,返回由Counter生成的字典的所有item,只是在Counter中此方法返回的是一个迭代器,而不是列表

####iterkeys

与字典dict的keys方法类似,返回由Counter生成的字典的所有key,只是在Counter中此方法返回的是一个迭代器,而不是列表

####itervalues

与字典dict的values方法类似,返回由Counter生成的字典的所有value,只是在Counter中此方法返回的是一个迭代器,而不是列表

deque双向队列

deque 包含在文件_collections.py中,属于高性能的数据结构(High performance data structures)之一,可以从两端添加和删除元素,常用的结构是它的简化版。

1
2
3
4
5
from collections import deque

str1 = 'abc123cd'
dq = deque(str1)
print(dq) # deque(['a', 'b', 'c', '1', '2', '3', 'c', 'd'])

常用方法

append 队列右边添加元素
appendleft 队列列左边添加元素
clear 清空队列中的所有元素
count 返回队列中包含value的个数
extend 队列右边扩展,可以是列表、元组、字典,字典的话只加入key
extendleft 同extend, 在左边扩展

1
2
3
4
5
6
7
from collections import deque

dq = deque('abc123')
dq.extend({1:10,2:20})
dq.extendleft('L')
dq.pop()
print(dq) # deque(['L', 'a', 'b', 'c', '1', '2', '3', 1, 2])

pop 移除并且返回队列右边的元素,不像列表的pop可以传索引删除
popleft 移除并且返回队列左边的元素
remove(value) 移除队列第一个出现的元素(从左往右开始的第一次出现的元素value)
reverse 对原队列的所有元素进行反转,无返回值
rotate(n) 对队列的数进行移动,若n<0,则往左移动即将左边的第一个移动到最后,移动n次,n>0 往右移动

1
2
3
4
5
from collections import deque

dq = deque([1, 2, 3, 4, 5])
dq.rotate(-1) # 左移,1往左移动一位到5后面
print(dq) # deque([2, 3, 4, 5, 1])

defaultdict默认字典

默认字典,是字典的一个子类,继承有字典的方法和属性,默认字典在进行定义初始化的时候可以指定字典的默认类型。

1
2
3
4
5
6
7
8
9
10
from collections import defaultdict

dic = defaultdict(list) # 元素默认类型为列表
dic['k1'] = [1, 2]
dic['k2'].append(1)
print(dic)

dic = defaultdict(dict) # 元素默认类型为字典
dic['k1'].update({'k2': 'aaa'})
print(dic)

OrderedDict有序字典

OrderDict 叫做有序字典,也是字典类型(dict)的一个子类,是对字典的一个补充。
传统字典是无序的,要排序的话,需要将字典的key取出进行排序,再输出打印。
有序字典的顺序将按照录入顺序进行排序且不会改变。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from collections import OrderedDict

dic2 = OrderedDict()
dic2['a'] = '123'
dic2['b'] = 'jjj'
dic2['c'] = 'abc'
dic2['d'] = '999'
for k, v in dic2.items():
print('有序字典:%s:%s' % (k, v))

"""
有序字典:a:123
有序字典:b:jjj
有序字典:c:abc
有序字典:d:999
"""

nametuple有名元组

标准的tuple类型使用数字索引来访问元素,元素多的时候,无法知道每个元素的索引。
nametuple 的创建是由自己的类工厂nametuple()进行创建,而不是由标准的元组来进行实例化,通过nametuple()创建类的参数包括类名称和一个包含元素名称的字符串。