collections 模組整理

2021-08-07 19:22:40 字數 4396 閱讀 9356

collections.deque 類(雙向佇列)是乙個執行緒安全、可以快速從兩端新增或者刪除元素的資料型別。而且如果想要有一種資料型別來存放「最近用到的幾個元素」, deque 也是乙個很好的選擇。這是因為在新建乙個雙向佇列的時候,你可以指定這個佇列的大小,如果這個佇列滿員了,還可以從反向端刪除過期的元素,然後在尾端新增新的元素。

deque(maxlen=n)建立乙個固定長度的佇列,當有新的記錄加入到已滿的佇列時會自動移除最老的那條記錄。

>>> 

from collections import deque

>>> q = deque(range(5), maxlen=5)

>>> q

deque([0, 1, 2, 3, 4], maxlen=5)

>>> q

deque([1, 2, 3, 4, 5], maxlen=5)

>>> q.rotate(3)

>>> q

deque([3, 4, 5, 1, 2], maxlen=5)

>>> q

deque([-1, 3, 4, 5, 1], maxlen=5)

>>> q.extendleft([11,22,33])

>>> q

deque([33, 22, 11, -1, 3], maxlen=5)

collections.counter這個對映型別會給鍵準備乙個整數計數器。每次更新乙個鍵的時候都會增加這個計數器。所以這個型別可以用來給可雜湊表物件計數,或者是當成多重集來用——多重集合就是集合裡的元素可以出現不止一次。 counter 實現了 + 和 - 運算子用來合併記錄,還有像most_common([n])這類很有用的方法, most_common([n]) 會按照次序返回對映裡最常見的 n 個鍵和它們的計數,官方文件。

>>> 

from collections import counter

>>> c = counter('asdasdafdsafsadfdsdgxcvsfdagvv')

>>> c

counter()

>>> c.update('wdaaffdsfsdfsa')

>>> c

counter()

關於counter乙個不為人知的特性,那就是它們可以輕鬆的同各種數**算操作結合起來使用,如:

這裡寫**片
使用dict時,如果引用的key不存在,就會丟擲keyerror。如果希望key不存在時,返回乙個預設值,就可以用defaultdict:

>>> from collections import defaultdict

>>> d = defaultdict(list)

>>> d['a']

>>> d

defaultdict('list'>, )

>>> d

defaultdict('list'>, )

>>> s = 'mississippi'

>>> d = defaultdict(int)

>>> for k in s:

d[k] += 1

>>> sorted(d.items())

[('i', 4), ('m', 1), ('p', 2), ('s', 4)]

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

如果要保持key的順序,可以用ordereddict。當對字典做迭代時候,它會嚴格按照元素初始新增的順序進行。

>>> from collections import ordereddict

>>> d = ordereddict()

>>> d

ordereddict()

>>> d['foo'] = 1

>>> d['bar'] = 2

>>> d['spam'] = 3

>>> d['grok'] = 4

>>> for key in d:

... print(key, d[key])

...foo 1

bar 2

spam 3

grok 4

ordereddict內部維護了乙個雙向鍊錶,它會根據元素的加入順序來排列鍵的位置。第乙個新加入的元素會被放置在鍊錶的末尾,接下來對已存在的鍵進行賦值時不會改變鍵的順序。

collections.namedtuple 是乙個工廠函式,它可以用來構建乙個帶欄位名的元組和乙個有名字的類——這個帶名字的類對除錯程式有很大幫助。

>>> 

from collections import namedtuple

>>> p = namedtuple('p', 'x y')

>>> p = p(1,2)

>>> p.x

1>>> p.y

2

>>> 

from collections import namedtuple

>>> city = namedtuple('city', 'name country population coordinates')

>>> tokyo = city('tokyo', 'jp', 36.933, (35.689722, 139.691667))

>>> tokyo

city(name='tokyo', country='jp', population=36.933, coordinates=(35.689722,

139.691667))

>>> tokyo.population

36.933

>>> tokyo.coordinates

(35.689722, 139.691667)

>>> tokyo[1]

'jp'

建立乙個具名元組需要兩個引數,乙個是類名,另乙個是類的各個欄位的名字。後者可以是由數個字串組成的可迭代物件,或者是由空格分隔開的欄位名組成的字串

該型別可以容納數個不同的對映物件,然後在進行鍵查詢操作的時候,這些物件會被當作乙個整體被逐個查詢,直到鍵被找到為止。這個功能在給有巢狀作用域的語言做直譯器的時候很有用,可以用乙個對映物件來代表乙個作用域的上下文。

>>> 

from collections import chainmap

>>> a =

>>> b =

>>> c = chainmap(a, b)

>>> c

chainmap(, )

chainmap可以接受多個對映然後在邏輯上使它們表現為乙個單獨的對映結構。但是,這些對映在字面上並不會合併在一起。相反,chainmap只是簡單的維護乙個記錄底層對映關係的列表,然後重新定義常見的字典操作來掃瞄這個列表。大部分的操作都可以正常的工作。

>>> len(c)

3>>> c.keys()

keysview(chainmap(, ))

>>> c.values()

valuesview(chainmap(, ))

>>> c['x']

1>>> c['y']

2

如果與重複的鍵,那麼這裡會採用第乙個對映中所對應的鍵值。

修改對映的操作總會作用在列出的第乙個對映結構上。

>>> c['y'] = 22

>>> c['z'] = 9

>>>

del c['x']

>>> a

>>> c

chainmap(, )

注:chainmap使用的是原始的字典,也就是說如果任乙個原始的字典發生了變化,那麼合併之後的字典也將會發生變化

>>> a['a'] = 4

>>> a

>>> c

chainmap(, )

而作為chainmap的替代方案,可能會考慮到利用字典的update()方法將多個字典合併在一起。

>>> a

>>> b

>>> merged = dict(b)

>>> merged.update(a)

>>> merged

>>>

但是,如果其中任意乙個原始字典發生了改變,這個改變都不會反應到合併後的字典中。

>>> a['x'] = 5

>>> a

>>> b

>>> merged

簡述模組 collections

collections模組主要封裝了一些關於集合類的相關操作。1.counter 是乙個計數器,主要用來計數。from collections import counter s 湯湯今晚的晚飯有餃子湯 print counter s counter from collections import c...

collections 集合模組

標準庫 collections 是 python 內建的乙個集合模組,裡面封裝了許多集合類。collections模組包含了除list dict 和tuple之外的容器資料型別,如counter defaultdict deque namedtuple orderdict等。這個模組實現了特定目標的...

collections模組的Counter類

counter類 counter類的目的是用來跟蹤值出現的次數。它是乙個無序的容器型別,以字典的鍵值對形式儲存,其中元素作為key,其計數作為value。計數值可以是任意的interger 包括0和負數 counter類和其他語言的bags或multisets很相似。1.建立counter 類 fr...