首頁 >後端開發 >Python教學 >python內建模組collections介紹

python內建模組collections介紹

angryTom
angryTom轉載
2019-11-30 15:45:214777瀏覽

python內建模組collections介紹

python內建模組collections介紹

collections是Python內建的集合模組,提供了許多有用的集合類別。

1、namedtuple

python提供了很多非常好用的基本類型,例如不可變類型tuple,我們可以輕鬆地用它來表示一個二元向量。

推薦學習:Python影片教學  

>>> v = (2,3)

我們發現,雖然(2,3)表示出了一個向量的兩個座標,但是,如果沒有額外說明,又很難直接看出這個元組是用來表示一個座標的。

為此定義一個class又小題大作了,這時,namedtuple就派上用場了。

>>> from collections import namedtuple
>>> Vector = namedtuple('Vector', ['x', 'y'])
>>> v = Vector(2,3)
>>> v.x
2
>>> v.y
3

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

這樣一來,我們用namedtuple可以很方便地定義一種資料型,它具備tuple的不變性,又可以根據屬性來引用,使用十分方便。

我們可以驗證建立的Vector物件的類型。

>>> type(v)
<class &#39;__main__.Vector&#39;>
>>> isinstance(v, Vector)
True
>>> isinstance(v, tuple)
True

類似的,如果要用座標和半徑表示一個圓,也可以用namedtuple定義:

>>> Circle = namedtuple(&#39;Circle&#39;, [&#39;x&#39;, &#39;y&#39;, &#39;r&#39;])
# namedtuple(&#39;名称&#39;, [‘属性列表’])

2、deque

##在數據結構中,我們知道佇列和堆疊是兩個非常重要的資料類型,一個先進先出,一個後進先出。在python中,使用list儲存資料時,按索引存取元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲,資料量大的時候,插入和刪除效率很低。

deque是為了有效率地實現插入和刪除操作的雙向鍊錶結構,非常適合實現佇列和堆疊這樣的資料結構。

>>> from collections import deque
>>> deq = deque([1, 2, 3])
>>> deq.append(4)
>>> deq
deque([1, 2, 3, 4])
>>> deq.appendleft(5)
>>> deq
deque([5, 1, 2, 3, 4])
>>> deq.pop()
4
>>> deq.popleft()
5
>>> deq
deque([1, 2, 3])

deque除了實作list的append()和pop()外,還支援appendleft()和popleft(),這樣就可以非常有效率地往頭部新增或刪除元素。

3、defaultdict

使用dict字典類型時,如果引用的key不存在,就會拋出KeyError。如果希望Key不存在時,回傳一個預設值,就可以用defaultdict。

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: &#39;defaultvalue&#39;)
>>> dd[&#39;key1&#39;] = &#39;a&#39;
>>> dd[&#39;key1&#39;]
&#39;a&#39;
>>> dd[&#39;key2&#39;] # key2未定义,返回默认值
&#39;defaultvalue&#39;

注意預設值是呼叫函數傳回的,而函數在建立defaultdict物件時傳入。

除了在Key不存在時回傳預設值,defaultdict的其他行為跟dict是完全一樣的。

4、OrderedDict

使用dict時,key是無序的。在對dict做迭代時,我們無法確定key的順序。

但是如果想要保持key的順序,可以用OrderedDict。

>>> from collections import OrderedDict
>>> d = dict([(&#39;a&#39;, 1), (&#39;b&#39;, 2), (&#39;c&#39;, 3)])
>>> d # dict的Key是无序的
{&#39;a&#39;: 1, &#39;c&#39;: 3, &#39;b&#39;: 2}
>>> od = OrderedDict([(&#39;a&#39;, 1), (&#39;b&#39;, 2), (&#39;c&#39;, 3)])
>>> od # OrderedDict的Key是有序的
OrderedDict([(&#39;a&#39;, 1), (&#39;b&#39;, 2), (&#39;c&#39;, 3)])

注意,OrderedDict的key會按照插入的順序排列,而不是key本身排序

>>> od = OrderedDict()
>>> od[&#39;z&#39;] = 1
>>> od[&#39;y&#39;] = 2
>>> od[&#39;x&#39;] = 3
>>> list(od.keys()) # 按照插入的Key的顺序返回
[&#39;z&#39;, &#39;y&#39;, &#39;x&#39;]

OrderedDict可以實現一個FIFO(先進先出)的dict,當容量超出限制時,先刪除最早新增的key。

from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict):
    def __init__(self, capacity):
        super(LastUpdatedOrderedDict, self).__init__()
        self._capacity = capacity
    def __setitem__(self, key, value):
        containsKey = 1 if key in self else 0
        if len(self) - containsKey >= self._capacity:
            last = self.popitem(last=False)
            print(&#39;remove:&#39;, last)
        if containsKey:
            del self[key]
            print(&#39;set:&#39;, (key, value))
        else:
            print(&#39;add:&#39;, (key, value))
        OrderedDict.__setitem__(self, key, value)

5、ChainMap

ChainMap可以把一組dict串起來並組成一個邏輯上的dict。 ChainMap本身也是一個dict,但是查找的時候,會按照順序在內部的dict依序查找。

什麼時候使用ChainMap最適合?舉個例子:應用程式往往都需要傳入參數,參數可以透過命令列傳入,可以透過環境變數傳入,還可以有預設參數。我們可以用ChainMap實作參數的優先權查找,也就是先查命令列參數,如果沒有傳入,再查環境變量,如果沒有,就使用預設參數。

下面的程式碼示範如何找出user和color這兩個參數。

from collections import ChainMap
import os, argparse
# 构造缺省参数:
defaults = {
    &#39;color&#39;: &#39;red&#39;,
    &#39;user&#39;: &#39;guest&#39;
}
# 构造命令行参数:
parser = argparse.ArgumentParser()
parser.add_argument(&#39;-u&#39;, &#39;--user&#39;)
parser.add_argument(&#39;-c&#39;, &#39;--color&#39;)
namespace = parser.parse_args()
command_line_args = { k: v for k, v in vars(namespace).items() if v }
# 组合成ChainMap:
combined = ChainMap(command_line_args, os.environ, defaults)
# 打印参数:
print(&#39;color=%s&#39; % combined[&#39;color&#39;])
print(&#39;user=%s&#39; % combined[&#39;user&#39;])

沒有任何參數時,列印出預設參數:

$ python3 use_chainmap.py 
color=red
user=guest

當傳入命令列參數時,優先使用命令列參數:

$ python3 use_chainmap.py -u bob
color=red
user=bob

同時傳入命令列參數和環境變量,命令列參數的優先權較高:

$ user=admin color=green python3 use_chainmap.py -u bob
color=green
user=bob

6、Counter

Counter是一個簡單的計數器,例如,統計字元出現的個數:

from collections import Counter
>>> s = &#39;abbcccdddd&#39;
>>> Counter(s)
Counter({&#39;d&#39;: 4, &#39;c&#39;: 3, &#39;b&#39;: 2, &#39;a&#39;: 1})

Counter其實也是dict的子類別。

7、小結

collections模組提供了一些有用的集合類,可以根據需要選用。


以上是python內建模組collections介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除