collections是python內建的乙個集合模組,提供了許多有用的集合類。
collections.namedtuple 是乙個工廠函式,它可以用來構建乙個帶欄位名的元組和乙個有名字的類——這個帶名字的類對除錯程式有很大幫助
用 namedtuple 構建的類的例項所消耗的記憶體跟元組是一樣的,因為欄位名都被存在對應的類裡面。這個例項跟普通的物件例項比起來也要小一些,因為 python不會用dict來存放這些例項的屬性。
>>
>
from collections import namedtuple
>>
> city = namedtuple(
'city'
,'name country population'
)>>
> beijing = city(
'beijing'
,'china'
,'90'
)>>
> beijing.name
'beijing'
>>
> beijing.population
'90'
>>
> beijing.country
'china'
說明:
① 建立乙個具名元組需要兩個引數,乙個是類名,另乙個是類的各個欄位的名字。後者可以是由數個字串組成的可迭代物件(列表或元組),或者是由空格分隔開的欄位名組成的字串。
② 存放在對應欄位裡的資料要以一串引數的形式傳入到建構函式中(注意,元組的建構函式卻只接受單一的可迭代物件)。
③ 你可以通過欄位名或者位置來獲取乙個欄位的資訊。
除了從普通元組那裡繼承來的屬性之外,具名元組還有一些自己專有的屬性。_fields 類屬性、類方法 _make(iterable) 和例項方法_asdict()。
>>
>
from collections import namedtuple
>>
> city = namedtuple(
'city'
,'name country population'
)>>
> city._fields
('name'
,'country'
,'population'
)>>
> city_info =
('tokyo'
,'jp'
,'36'
)>>
> city2 = city._make(city_info)
>>
> city2
city(name=
'tokyo'
, country=
'jp'
, population=
'36'
)>>
> city2._asdict(
)ordereddict([(
'name'
,'tokyo'),
('country'
,'jp'),
('population'
,'36')]
)>>
> city2._asdict()[
'name'
]'tokyo'
說明:
① _fields 屬性是乙個包含這個類所有欄位名稱的元組。
② 用 _make() 通過接受乙個可迭代物件來生成這個類的乙個例項,它的作用跟city(*city_info) 是一樣的。
③ _asdict() 把具名元組以 collections.ordereddict 的形式返回,我們可以利用它來把元組裡的資訊友好地呈現出來。
>>
>
from collections import deque
>>
> dq = deque(
range(10
), maxlen=
10) ➊
>>
> dq
deque([0
,1,2
,3,4
,5,6
,7,8
,9], maxlen=10)
>>
> dq.rotate(
3) ➋
>>
> dq
deque([7
,8,9
,0,1
,2,3
,4,5
,6], maxlen=10)
>>
> dq.rotate(-4
)>>
> dq
deque([1
,2,3
,4,5
,6,7
,8,9
,0], maxlen=10)
>>-1
) ➌>>
> dq
deque([-
1,1,
2,3,
4,5,
6,7,
8,9]
, maxlen=10)
>>
> dq.extend([11
,22,33
]) ➍
>>
> dq
deque([3
,4,5
,6,7
,8,9
,11,22
,33], maxlen=10)
>>
> dq.extendleft([10
,20,30
,40]) ➎
>>
> dq
deque([40
,30,20
,10,3
,4,5
,6,7
,8], maxlen=
10)
使用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'
注意預設值是呼叫函式返回的,而函式在建立defaultdict物件時傳入。
除了在key不存在時返回預設值,defaultdict的其他行為跟dict是完全一樣的。
當字典 d[k] 不能找到正確的鍵的時候,python 會丟擲異常,這個行為符合 python 所信奉的「快速失敗」哲學。也許每個 python 程式設計師都知道可以用 d.get(k, default) 來代替d[k],給找不到的鍵乙個預設的返回值(這比處理 keyerror 要方便不少)。但是要更新某個鍵對應的值的時候,不管使用 _getitem_ 還是 get 都會不自然,而且效率低。
這個型別在新增鍵的時候會保持順序,因此鍵的迭代次序總是一致的。ordereddict 的 popitem 方法預設刪除並返回的是字典裡的最後乙個元素,但是如果像 my_odict.popitem(last=false) 這樣呼叫它,那麼它刪除並返回第乙個被新增進去的元素。
>>
>
from collections import ordereddict
>>
> od = ordereddict([(
'a',1)
,('b',2)
,('c',3)
])>>
> od
ordereddict([(
'a',1)
,('b',2)
,('c',3)
])>>
> d =
dict([
('a',1
),('b',2
),('c',3
)])>>
> d
>>
> od.popitem()(
'c',3)
>>
> d.popitem()(
'a',
1)
這個對映型別會給鍵準備乙個整數計數器。每次更新乙個鍵的時候都會增加這個計數器。所以這個型別可以用來給可雜湊表物件計數,或者是當成多重集來用——多重集合就是集合裡的元素可以出現不止一次。counter 實現了 + 和 - 運算子用來合併記錄,還有像 most_common([n]) 這類很有用的方法。most_common([n]) 會按照次序返回對映裡最常見的 n 個鍵和它們的計數。
>>
>
from collections import counter
>>
> ct = counter(
'abracadabra'
)>>
> ct
counter(
)>>
> ct.update(
'aaaaazzz'
)>>
> ct
counter(
)>>
> ct.most_common(2)
[('a',10)
,('z',3)
]
《流暢的python》luciano ramalho 2023年5月15日人民郵電出版社發行
廖雪峰的官方**:collections 模組的使用
collections模組的Counter類
counter類 counter類的目的是用來跟蹤值出現的次數。它是乙個無序的容器型別,以字典的鍵值對形式儲存,其中元素作為key,其計數作為value。計數值可以是任意的interger 包括0和負數 counter類和其他語言的bags或multisets很相似。1.建立counter 類 fr...
collections 好用的模組
2.ordereddict 1.1 示例1from collections import namedtuple pepole namedtuple people name age gender person pepole name 小明 age 18 gender 男 print person pr...
collections 模組整理
collections.deque 類 雙向佇列 是乙個執行緒安全 可以快速從兩端新增或者刪除元素的資料型別。而且如果想要有一種資料型別來存放 最近用到的幾個元素 deque 也是乙個很好的選擇。這是因為在新建乙個雙向佇列的時候,你可以指定這個佇列的大小,如果這個佇列滿員了,還可以從反向端刪除過期的...