當使用Python 3個字典,我一直有做這樣的事情:如何本地遞增字典元素的值?
d=dict()
if 'k' in d:
d['k']+=1
else:
d['k']=0
我似乎記得那裏是做這個原生的方式,但一直在尋找通過的文件,但沒有找到它。你知道這是什麼嗎?
當使用Python 3個字典,我一直有做這樣的事情:如何本地遞增字典元素的值?
d=dict()
if 'k' in d:
d['k']+=1
else:
d['k']=0
我似乎記得那裏是做這個原生的方式,但一直在尋找通過的文件,但沒有找到它。你知道這是什麼嗎?
這是collections.defaultdict
的用例,這裏簡單地使用int
可調用默認工廠。
>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> d
defaultdict(<class 'int'>, {})
>>> d['k'] +=1
>>> d
defaultdict(<class 'int'>, {'k': 1})
A defaultdict
被配置爲每當搜索到缺失的密鑰時創建項目。您爲它提供了一個可調用的函數(這裏是int()
),只要通過__getitem__
的查找傳遞了一個不存在的密鑰,就會使用它來生成默認值。該可調用對象存儲在一個名爲default_factory
的實例屬性中。
如果您沒有提供default_factory
,那麼按照慣例,您會得到一個KeyError
,用於丟失密鑰。
然後假設你想要一個不同的默認值,也許是1而不是0只需將必須通過調用提供您所需的初始值,在這種情況下,很平凡
>>> d = defaultdict(lambda: 1)
這可能也很明顯是任何常規的命名函數。
值得一但指出的是,如果你的情況,你正試圖只用字典來存儲特定值的計數,collections.Counter
更適合這份工作。
>>> from collections import Counter
>>> Counter('kangaroo')
Counter({'a': 2, 'o': 2, 'n': 1, 'r': 1, 'k': 1, 'g': 1})
留意,你總是可以通過在表達式中使用它刪除從if
stamemt雜波:
d['k'] = d['k'] + 1 if 'k' in d else 0