collections 模組的使用

2021-09-25 22:02:26 字數 4862 閱讀 9983

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 也是乙個很好的選擇。這是因為在新建乙個雙向佇列的時候,你可以指定這個佇列的大小,如果這個佇列滿員了,還可以從反向端刪除過期的...