python—collections模組(defaultdict、Counter、OrderedDict)
1.defaultdict
現在假設這樣一種情況,有一組列表字串。我們需要統計每個字串出現的次數,並以鍵值對的形式儲存起來。下面先來演示一個錯誤的寫法。
a = ['a','b','r','a','d','r']
b = {}
for i in a:
b[i] += 1
print(b)
Traceback (most recent call last):
File "D:/Spider_base/test.py", line 5, in <module>
b[i] += 1
KeyError: 'a'
報錯的原因是,字典對於不存在key直接取值的話,會顯示KeyError。如果不想報錯,我們就需要加上一個判斷,對於不存在的key,我們就加上,並賦予初值為1。如下:
a = ['a','b','r','a','d','r']
b = {}
for i in a:
if i in b.keys():
b[i] += 1
else:
b[i] = 1
print(b)
{'a': 2, 'b': 1, 'r': 2, 'd': 1}
對於上述程式碼,我們還可以進行優化,即使用字典的setdefault來代替if語句。對於不存在的key賦予預設值0,存在的key就不做任何操作。
a = ['a','b','r','a','d','r']
b = {}
for i in a:
b.setdefault(i,0)
b[i] += 1
print(b)
{'a': 2, 'b': 1, 'r': 2, 'd': 1}
問題來了,我們還可以再優化嗎?上一次優化雖然去除了if語句,但對於每一個key,我們都需要進行判斷是否需要給一個預設值。
答案是可以再次優化,python提供了一種預設值字典的資料結構。它允許我們在定義字典時給所有不存在的key設定預設值,這樣當取不存在的key時,就不會報錯。
from collections import defaultdict
a = ['a','b','r','a','d','r']
b = defaultdict(int)
for i in a:
b[i] += 1
print(b)
defaultdict(<class 'int'>, {'a': 2, 'b': 1, 'r': 2, 'd': 1})
defaultdict字典相當於是普通欄位的強化版,繼承原始dict的功能,並賦予了它新的特性。
初始化defaultdict的引數是一個可呼叫物件,即函式名。int函式就相當於函式如下:
def fun():
return 0
也可以使用匿名函式如下:
b = defaultdict(lambda :0)
也可以使用:list對應[ ],str對應的是空字串,set對應set( ),int對應0
2.OrderedDict
使用dict時,Key是無序的。在對dict做迭代時,我們無法確定Key的順序。如果要保持Key的順序,可以用OrderedDict。
from collections import OrderedDict
a = OrderedDict()
print(a.fromkeys(['a','b','d','c'],'qq'))
OrderedDict([('a', 'qq'), ('b', 'qq'), ('d', 'qq'), ('c', 'qq')])
OrderedDict的Key會按照插入的順序排列,不是Key本身排序。
3.Counter
Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器型別,以字典的鍵值對形式儲存,其中元素作為key,其計數作為value。計數值可以是任意的Interger(包括0和負數)。
1.建立:
from collections import Counter
a = Counter()
b = Counter('afdasfdasd')
c = Counter({'a':4,'b':7})
d = Counter(a=4,b=7)
print(a,b,c,d)
Counter() Counter({'a': 3, 'd': 3, 'f': 2, 's': 2}) Counter({'b': 7, 'a': 4}) Counter({'b': 7, 'a': 4})
建立的方式有三種,第一種是空的Counter類,第二種傳入一個可迭代物件,可以是str、list、tuple、dict,最後一種是以鍵值對的形式。
2.訪問:
因為最後的計數結果是一個字典的樣式,故訪問通過訪問字典的方式,但若查詢的key不存在將會報錯。
3.most_common([n]):
該函式是將計數結果以列表巢狀二元元組的形式返回。引數n表示給最多n個元素計數,且計數量大的優先,預設返回所有計數。
from collections import Counter
b = Counter('afdasfdasd')
print(b)
print(b.most_common())
print(b.most_common(2))
Counter({'a': 3, 'd': 3, 'f': 2, 's': 2})
[('a', 3), ('d', 3), ('f', 2), ('s', 2)]
[('a', 3), ('d', 3)]
相關文章
- Python中的collections.Counter模組Python
- Python計數:defaultdict和CounterPython
- Python中Collections.counter用法Python
- Python的defaultdict模組和namedtuple模組Python
- python中collections.Counter是什麼?Python
- Python collections.defaultdict() 與 dict的使用和區別Python
- 【python】Python標準庫defaultdict模組Python
- python collections模組Python
- python模組之collections模組Python
- Python 的 collections模組Python
- Python collections 模組筆記Python筆記
- 如何使用python計數模組counter?Python
- collections模組
- 不可不知的python模組–collectionsPython
- 每日一模組-collections
- Python-defaultdict(type)字典Python
- Python原生資料結構增強模組collectionsPython資料結構
- time模組,collections模組,佇列和棧佇列
- python: collectionsPython
- 一道演算法題,引出collections.Counter的特殊用法演算法
- python linkedhashset 簡單實現,使用OrderedDictPython
- 【Python】計數器 CounterPython
- python - Counter簡單使用Python
- pickle模組 collections模組在物件導向中的應用物件
- python學習:counter計數Python
- counter-reset、counter()和counter-increment用法REM
- Go 實現的 python collectionsGoPython
- [PY3]——找出一個序列中出現次數最多的元素/collections.Counter 類的用法
- Python實用技法第5篇:一鍵多值字典:defaultdictPython
- B - Ticket Counter
- Decade counter
- python 模組:itsdangerous 模組Python
- Python模組:time模組Python
- urlparse模組(python模組)Python
- python模組-re模組Python
- python模組 - functools模組Python
- CSS裡的CounterCSS
- CSS3 counter()CSSS3