Python標準庫之collections

本文主要參考廖雪峰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除了實現listappend()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)])

注意OrderedDictKey會按照插入的順序排列,不是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})
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容