Python模塊之collections
模塊介紹
在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
- namedtuple: 生成可以使用名字來訪問元素內容的tuple
- deque: 雙端隊列,可以快速的從另外一側追加和推出對象
- Counter: 計數器,主要用來計數
- OrderedDict: 有序字典
- defaultdict: 帶有默認值的字典
應用
namedtuple
我們知道tuple
可以表示不變集合,例如,一個點的二維坐標就可以表示成:
>>> p = (1, 2)
但是,看到(1, 2),很難看出這個tuple是用來表示一個坐標的。
這時,namedtuple
就派上了用場:
from collections import namedtuple point = namedtuple(‘Point‘, [‘x‘, ‘y‘]) p = point(1, 2) print(p.x, p.y) # 答案: # 1 2定義一個點
類似的,如果要用坐標和半徑表示一個圓,也可以用namedtuple
定義:
#namedtuple(‘名稱‘, [屬性list]): Circle = namedtuple(‘Circle‘, [‘x‘, ‘y‘, ‘r‘])
deque
使用list存儲數據時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲,數據量大的時候,插入和刪除效率很低。
deque是為了高效實現插入和刪除操作的雙向列表,適合用於隊列和棧:
from collections import deque q = deque([‘a‘, ‘b‘, ‘c‘]) q.append(‘x‘) q.appendleft(‘y‘) print(q) # 答案: # deque([‘y‘, ‘a‘, ‘b‘, ‘c‘, ‘x‘])插入數據
deque除了實現list的append()
pop()
外,還支持appendleft()
和popleft()
,這樣就可以非常高效地往頭部添加或刪除元素。
OrderedDict
使用dict時,Key是無序的。在對dict做叠代時,我們無法確定Key的順序。
如果要保持Key的順序,可以用OrderedDict
:
from collections import OrderedDict d = dict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) print(d) od = OrderedDict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) print(type(od), od[‘a‘]) od = OrderedDict() od[‘z‘] = 1 od[‘y‘] = 2 od[‘x‘] = 3 print(od.keys()) # 答案: {‘a‘: 1, ‘b‘: 2, ‘c‘: 3} <class ‘collections.OrderedDict‘> 1 odict_keys([‘z‘, ‘y‘, ‘x‘])View Code
註意,OrderedDict
的Key會按照插入的順序排列,不是Key本身排序。
defaultdict
有如下值集合 [
11
,
22
,
33
,
44
,
55
,
66
,
77
,
88
,
99
,
90.
..],將所有大於
66
的值保存至字典的第一個key中,將小於
66
的值保存至第二個key的值中。
即: {
‘k1‘
: 大於
66
,
‘k2‘
: 小於
66
}:
values = [11, 22, 33,44,55,66,77,88,99,90] my_dict = {} for value in values: if value > 66: if my_dict.__contains__(‘k1‘): # 用於判斷鍵是否存在於字典中,如果鍵在字典dict裏返回true,否則返回false。 my_dict[‘k1‘].append(value) else: my_dict[‘k1‘] = [value] else: if my_dict.__contains__(‘k2‘): my_dict[‘k2‘].append(value) else: my_dict[‘k2‘] = [value] print(my_dict) # 答案: {‘k2‘: [11, 22, 33, 44, 55, 66], ‘k1‘: [77, 88, 99, 90]}原始方法
from collections import defaultdict values = [11, 22, 33,44,55,66,77,88,99,90] my_dict = defaultdict(list) for value in values: if value > 66: my_dict[‘k1‘].append(value) else: my_dict[‘k2‘].append(value) print(my_dict) # 答案: defaultdict(<class ‘list‘>, {‘k2‘: [11, 22, 33, 44, 55, 66], ‘k1‘: [77, 88, 99, 90]})defaultdict方法
使用dict
時,如果引用的Key不存在,就會拋出KeyError
。如果希望key不存在時,返回一個默認值,就可以用defaultdict
:
>>> from collections import defaultdict >>> dd = defaultdict(lambda: ‘N/A‘) >>> dd[‘key1‘] = ‘abc‘ >>> dd[‘key1‘] # key1存在 ‘abc‘ >>> dd[‘key2‘] # key2不存在,返回默認值 ‘N/A‘
Counter
Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素作為key,其計數作為value。計數值可以是任意的Interger(包括0和負數)。Counter類和其他語言的bags或multisets很相似。
c = Counter(‘abcdeabcdabcaba‘) print c 輸出:Counter({‘a‘: 5, ‘b‘: 4, ‘c‘: 3, ‘d‘: 2, ‘e‘: 1})
其他詳細內容 點擊這裏
Python模塊之collections