1 1.namedtuple 2 tuple可以用来表示不变集合,例如,一个点的二维坐标就可以表示成:p=(1,2) 3 但是,看到(1, 2),很难看出这个tuple表示的是一个坐标。 4 这时就可以使用nametuple来处理: 5 from collections import namedtuple 6 Point = namedtuple('Point', ['x', 'y']) 7 p = Point(1, 2) 8 print(p.x) 9 print(p.y) 10 1 11 2 12 13 namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。 14 这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。 15 格式:namedtuple('名称', [属性list]) 16 #用坐标和半径来表示一个圆 17 Circle = namedtuple('Circle', ['x', 'y', 'r']) 18 19 2.deque 20 使用list列表存储数据时,按索引访问元素很快,但是插入和删除元素就比较慢,因为list是线性存储,数据量大的时候,插入和删除效率很低。 21 deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈: 22 from collections import deque 23 q = deque(['a', 'b', 'c']) 24 q.append('x') 25 q.appendleft('y') 26 q.pop() 27 q.popleft() 28 print(q) 29 输出如下: 30 deque(['y', 'a', 'b', 'c', 'x']) 31 deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。 32 33 3.defaultdict 34 使用list列表存储数据时,按索引访问元素很快,但是插入和删除元素就比较慢,因为list是线性存储,数据量大的时候,插入和删除效率很低。 35 deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈: 36 from collections import deque 37 q = deque(['a', 'b', 'c']) 38 q.append('x') 39 q.appendleft('y') 40 print(q) 41 输出如下: 42 deque(['y', 'a', 'b', 'c', 'x']) 43 deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。 44 45 4.OrderedDict 46 使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。 47 如果要保持Key的顺序,可以用OrderedDict: 48 from collections import OrderedDict 49 d = dict([('a', 1), ('b', 2), ('c', 3)]) 50 print(d) # dict的Key是无序的 51 {'a': 1, 'c': 3, 'b': 2} 52 od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) 53 print(od) # OrderedDict的Key是有序的 54 OrderedDict([('a', 1), ('b', 2), ('c', 3)]) 55 56 注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序: 57 from collections import OrderedDict 58 od = OrderedDict() 59 od['z'] = 1 60 od['y'] = 2 61 od['x'] = 3 62 print(od.keys()) 63 odict_keys(['z', 'y', 'x']) 64 print(list(od.keys())) # 按照插入的Key的顺序返回 65 输出 : ['z', 'y', 'x'] 66 67 OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key: 68 from collections import OrderedDict 69 class LastUpdatedOrderedDict(OrderedDict): 70 71 def __init__(self, capacity): 72 super(LastUpdatedOrderedDict, self).__init__() 73 self._capacity = capacity 74 75 def __setitem__(self, key, value): 76 containsKey = 1 if key in self else 0 77 if len(self) - containsKey >= self._capacity: 78 last = self.popitem(last=False) 79 print('remove:', last) 80 if containsKey: 81 del self[key] 82 print('set:', (key, value)) 83 else: 84 print('add:', (key, value)) 85 OrderedDict.__setitem__(self, key, value) 86 87 88 from collections import OrderedDict 89 class LastUpdatedOrderedDict(OrderedDict): 90 91 def __init__(self, capacity): 92 super(LastUpdatedOrderedDict, self).__init__() 93 #设置字典容量 94 self._capacity = capacity 95 #print(self._capacity) 3 96 97 def __setitem__(self, key, value): 98 #判断,如果key在当前实例中,返回1否则返回0 99 containsKey = 1 if key in self else 0 100 #判断,如果元素的个数-1或-0大于等于3,就需要删除前面的元素了 101 if len(self) - containsKey >= self._capacity: 102 print(len(self),self._capacity) 103 last = self.popitem(last=False) 104 print('remove:', last) 105 #如果key在当前实例中,则删除key对应的值,从新赋值 106 if containsKey: 107 del self[key] 108 print('set:', (key, value)) 109 #否则只进行添加 110 else: 111 print('add:', (key, value)) 112 #使用OrderedDict的__setitem__方法设置key和value 113 OrderedDict.__setitem__(self, key, value) 114 if __name__=='__main__': 115 luod=LastUpdatedOrderedDict(3) 116 luod['key1']=4 117 #print(luod.__dict__) 118 luod['key2']=5 119 luod['key3']=6 120 luod['key4']=7 121 luod['key1']=8 122 luod['key1']=9 123 print(list(luod.items())) 124 125 #add: ('key1', 4) 126 # add: ('key2', 5) 127 # add: ('key3', 6) 128 # 3 3 129 # remove: ('key1', 4) 130 # add: ('key4', 7) 131 # 3 3 132 # remove: ('key2', 5) 133 # add: ('key1', 8) 134 # set: ('key1', 9) 135 # [('key3', 6), ('key4', 7), ('key1', 9)] 136 137 138 5.Counter 139 Counter是一个简单的计数器,目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。 140 例如,统计字符出现的个数: 141 from collections import Counter 142 c = Counter() 143 for ch in 'programming': 144 c[ch] = c[ch] + 1 145 print(c) 146 Counter实际上也是dict的一个子类,上面的结果可以看出,字符'g'、'm'、'r'各出现了两次,其他字符各出现了一次。
2019-02-23