collections模块

  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

原文地址:https://www.cnblogs.com/zpdbkshangshanluoshuo/p/10423180.html