本文主要參考廖雪峰Python教程以及ZiWenXie
前面提到字典是無序的,但有時我們需要有序的字典,這時就要用到Python標準庫中的collections包了。
-
namedtuple
namedtuple
是一個函數,它用來創建一個自定義的tuple
對象,并且規定了tuple
元素的個數,并可以用屬性而不是索引來引用tuple
的某個元素。
這樣一來,我們用namedtuple
可以很方便地定義一種數據類型,它具備tuple的不變性,又可以根據屬性來引用,使用十分方便。
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2
#類似的,如果要用坐標和半徑表示一個圓,也可以用namedtuple定義
Circle=namedtuple(`Circle`,["x","y","r"]) #namedtuple("名稱",[屬性list])
-
deque
使用list
存儲數據時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list
是線性存儲的單鏈表數據結構,數據量大的時候,插入和刪除效率很低。
deque
是為了高效實現插入和刪除操作的雙向列表,deque
除了實現list
的append()
和pop()
外,還支持appendleft()
和popleft()
,這樣就可以非常高效地往頭部添加或刪除元素。適合用于隊列和棧:
>>>from collections import deque
>>>q=deque(["a","b","c"])
>>>q.append("x")
>>>q.appendleft("y")
>>>q
deque(["y","a","b","c","x"])
>>>q.popleft()
>>>q
deque(["a","b","c","x"])
-
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'
-
OrderedDict
使用dict
時,Key
是無序的。在對dict
做迭代時,我們無法確定Key
的順序。如果要保持Key
的順序,可以用OrderedDict
:
>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict的Key是無序的
{'a': 1, 'c': 3, 'b': 2}
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
注意,OrderedDict
的Key
會按照插入的順序排列,不是Key
本身排序,如果想讓OrderedDict以key或者value排序,可以使用sorted()方法。
>>>d = {"c":3,"a":1,"b":2,"d":4}
>>>OrderedDict(sorted(d.items),key=lambda d: d[0], reverse=True) #按key排序
OrderedDict( [('d', 4), ('c', 3), ('b', 2), ('a', 1)])
>>>OrderedDict(sorted(d.items()),key=lambda d: d[0], reverse=True) #按value排序
OrderedDict( [('d', 4), ('c', 3), ('b', 2), ('a', 1)])
#也可以自定義一些排序條件
>>>OrderedDict(sorted(d.items()),key=lambda d: len(d[0]), reverse=False) #按key長度排序
還可以使用move_to_end(key,last=True)
來改變OrderedDict
對象的key-value
順序,通過這個方法可以將OrderedDict
中任意一個key-value
插入到開頭或者結尾。
-
ChainMap
ChainMap
可以將多個dict
組成一個類似list
,類似合并字典,較update
效率高。
>>>from collections import ChainMap
>>>a={"a":"A","b":"B"}
>>>b={"c":"C","d":"D"}
>>>m=ChainMap(a,b)
>>>m
ChainMap({"a":"A","b":"B"},{"c":"C","d":"D"})
>>>m["a"]
A
>>>m["b"]
B
-
Counter
Counter是一個簡單的計數器,例如,統計字符出現的個數:
>>> from collections import Counter
>>> c = Counter()
>>> for ch in 'programming':
... c[ch] = c[ch] + 1
...
>>> c
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})