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...