Counter
这是一个继承dict的子类,专门用来做计数器,dict中的方法这里同样适用
from collections import Counter其中数学运算如果其中一方的不存在,则会默认创建对应键,值为0的键值对
counter = Counter("accab") # Counter({‘a‘: 2, ‘c‘: 2, ‘b‘: 1}) counter2 = Counter([1,2,3,4]) # Counter({1: 1, 2: 1, 3: 1, 4: 1}) counter5 = Counter([(‘a‘,3),(‘b‘, 2)]) # Counter({(‘a‘, 3): 1, (‘b‘, 2): 1}) # 字典 counter3 = Counter({‘a‘: 1, ‘b‘: 2, ‘a‘: 3}) # Counter({‘a‘: 3, ‘b‘: 2}) counter4 = Counter(a=1, b=2, c=1) # Counter({‘b‘: 2, ‘a‘: 1, ‘c‘: 1}) # elements # 键值以无序的方式返回,并且只返回值大于等于1的键值对 elememts = counter.elements() print([x for x in elememts]) # [‘a‘, ‘a‘, ‘c‘, ‘c‘, ‘b‘] # 为空是因为elements是generator print(sorted(elememts)) # [] # most_common # 键值以无序的方式返回 print(counter.most_common(1)) # [(‘a‘, 2)] print(counter.most_common()) # [(‘a‘, 2), (‘c‘, 2), (‘b‘, 1)] # update # 单纯是增加的功能,而不是像dict.update()中的替换一样 counter.update("abb") print(counter) # Counter({‘a‘: 3, ‘b‘: 3, ‘c‘: 2}) # subtract counter.subtract(Counter("accc")) print(counter) # Counter({‘b‘: 3, ‘a‘: 2, ‘c‘: -1}) print([x for x in counter.elements()]) # [‘a‘, ‘a‘, ‘b‘, ‘b‘, ‘b‘] # get # 键不存在则返回0,但是不会加入到counter键值对中 print(counter[‘d‘]) print(counter) # Counter({‘b‘: 3, ‘a‘: 2, ‘c‘: -1}) del counter[‘d‘] # 还可以使用数学运算 c = Counter(a=3, b=1) d = Counter(a=1, b=2) # add two counters together: c[x] + d[x] print(c + d) # Counter({‘a‘: 4, ‘b‘: 3}) # subtract (keeping only positive counts) print(c - d) # Counter({‘a‘: 2}) # # intersection: min(c[x], d[x]) print(c & d) # Counter({‘a‘: 1, ‘b‘: 1}) # union: max(c[x], d[x]) print(c | d) # Counter({‘a‘: 3, ‘b‘: 2}) # 一元加法和减法 c = Counter(a=3, b=-1) # 只取正数 print(+c) # Counter({‘a‘: 3}) print(-c) # Counter({‘b‘: 1})
deque
由于deque同样能够提供列表相关的函数,所以其和列表相同的函数则不再赘述,这里比较独特的是和left
相关的函数以及rotate
函数。
from collections import deque # 从尾部进入,从头部弹出,保证长度为5 dq1 = deque(‘abcdefg‘, maxlen=5) print(dq1) # [‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘] print(dq1.maxlen) # 5 # 从左端入列 dq1.appendleft(‘q‘) print(dq1) # [‘q‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘] # 从左端入列 dq1.extendleft(‘abc‘) print(dq1) # [‘c‘, ‘b‘, ‘a‘, ‘q‘, ‘c‘] # 从左端出列并且返回 dq1.popleft() # c print(dq1) # [‘b‘, ‘a‘, ‘q‘, ‘c‘] # 将队头n个元素进行右旋 dq1.rotate(2) print(dq1) # [‘q‘, ‘c‘, ‘b‘, ‘a‘] # 将队尾两个元素进行左旋 dq1.rotate(-2) print(dq1) # [‘b‘, ‘a‘, ‘q‘, ‘c‘] def tail(filename, n=10): ‘Return the last n lines of a file‘ with open(filename) as f: return deque(f, n) def delete_nth(d, n): """ 实现队列切片和删除,pop之后再放会原处 :param d: deque :param n: int :return: """ d.roatte(-n) d.popleft() d.rotate(n)
OrderedDict
OrderedDict提供了一个有序字典,可以使用在遍历的时候根据相应的顺序进行输出,因为在dict中它的item是以任意顺序进行输出的。
注意初始化的时候和在插入的话都根据插入顺序进行排序,而不是根据key进行排序。
from collections import OrderedDict items = {‘c‘: 3, ‘b‘: 2, ‘a‘: 1} regular_dict = dict(items) ordered_dict = OrderedDict(items) print(regular_dict) # {‘c‘: 3, ‘b‘: 2, ‘a‘: 1} print(ordered_dict) # [(‘c‘, 3), (‘b‘, 2), (‘a‘, 1)] # 按照插入顺序进行排序而不是 ordered_dict[‘f‘] = 4 ordered_dict[‘e‘] = 5 print(ordered_dict) # [(‘c‘, 3), (‘b‘, 2), (‘a‘, 1), (‘f‘, 4), (‘e‘, 5)] # 把最近加入的删除 print(ordered_dict.popitem(last=True)) # (‘e‘, 5) # 按照加入的顺序删除 print(ordered_dict.popitem(last=False)) # (‘c‘, 3) print(ordered_dict) # [(‘b‘, 2), (‘a‘, 1), (‘f‘, 4)] # 移动到末尾 ordered_dict.move_to_end(‘b‘, last=True) print(ordered_dict) # [(‘a‘, 1), (‘f‘, 4), (‘b‘, 2)] # 移动到开头 ordered_dict.move_to_end(‘b‘, last=False) print(ordered_dict) # [(‘b‘, 2), (‘a‘, 1), (‘f‘, 4)] ordered_dict[‘a‘] = 3 # 说明更改值并不会影响加入顺序 print(ordered_dict.popitem(last=True)) # (‘f‘, 4)
提供了字典的功能,又保证了顺序。
namedtuple
如果我们想要在tuple中使用名字的参数,而不是位置,namedtuple提供这么一个创建名称tuple的机会。
from collections import namedtuple Point = namedtuple(‘Point‘, [‘x‘, ‘y‘]) p = Point(10, y=20) print(p) # Point(x=10, y=20) print(p.x + p.y) # 30