python的collections庫用法總結

最近在編碼過程當中,發現collections庫裏提供了很是多有用的工具,能夠優化編碼風格,提高開發效率。node

下面是我結合本身開發和網上資料的一些總結。python

defaultdict

使用dict時,若是引用的Key不存在,就會拋出KeyError。若是但願key不存在時,返回一個默認值,就能夠用defaultdictbash

在沒有接觸到它以前,我在代碼裏常常使用setdafult來給字典設置初始值,但這樣可讀性很差,也不夠優雅,好比這一段:app

for cate in res_service_category:
    category_id = cate['id']
    biz_service_category_mapping = self._service_category_data.setdefault(bk_biz_id, {})
    biz_service_category_mapping[category_id] = cate
複製代碼

若是用了defaultdict呢?是否是簡潔多了。函數

self._service_category_data = defaultdict()
for cate in res_service_category:
    category_id = cate['id']
    biz_service_category_mapping = self._service_category_data[bk_biz_id]
    biz_service_category_mapping[category_id] = cate
複製代碼

OrderedDict

衆所周知,使用dict時,Key是無序的。在對dict作迭代時,咱們沒法肯定Key的順序。工具

若是要保持Key的順序,能夠用OrderedDict優化

nodes_category = OrderedDict([('ADD', []), ('REMOVE', []), ('RETRY', [])])
複製代碼

這樣在遍歷該字典時,就能保證它的順序了。編碼

namedtuple

namedtuple是一個函數,它用來建立一個自定義的tuple對象,而且規定了tuple元素的個數,並能夠用屬性而不是索引來引用tuple的某個元素。spa

這樣一來,咱們用namedtuple能夠很方便地定義一種數據類型,它具有tuple的不變性,又能夠根據屬性來引用,使用十分方便。code

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2
複製代碼

deque

使用list存儲數據時,按索引訪問元素很快,可是插入和刪除元素就很慢了,由於list是線性存儲,數據量大的時候,插入和刪除效率很低。

deque是爲了高效實現插入和刪除操做的雙向列表,適合用於隊列和棧

>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])
複製代碼

總結

我知道關於collections庫的使用,對於不少python高手來講,都已經得心應手了,根本不須要再讀這一篇。我想表達的是,如何寫出優雅的代碼,或者寫出精益求精的代碼,須要有很長的路要走,並且這是一條無窮無盡的上升道路,而對於每一位coder,都走在屬於本身的道路上。so,keep moving。

相關文章
相關標籤/搜索