2017-04-07 21 views
1

對於可變類型,如列表,而是採用if else,我們可以處理丟失的關鍵問題是這樣的:處理缺失與數字類型鍵在Python

dic = {'key1':[1, 2], 'key2':[1]} 
dic.setdefault('key3', []).append(1) 

這隻能檢查dic'key3'只有一次。

但對於不可改變的類型,比如整數,我們不能用setdefault()這樣的:

dic = {'key1':3, 'key2':5} 
dic.setdefault('key3', 0) += 1 

由於setdefault()將返回整數0而不是可變dic['key3']

我不知道該如何處理與它優雅,例如我能做的最好的是這樣的:

dic = {'key1':3, 'key2':5} 
dic['key3'] = 1 if 'key3' not in dic else dic['key3'] + 1 

但是如果'key3'存在,此代碼會檢查'key3'兩次dic,並使用額外內存dic['key3'] + 1

有什麼建議嗎?

+1

使用['collections.defaultdict(int)'](https://docs.python.org/3/library/collections.html#defaultdict-objects)?請注意,這實際上是關於可變性與不可變性的 - 「元組」仍然可迭代,但會遇到與整數相同的問題。再次檢查dic'中的''key3'是否真的不是什麼大問題;由於它是一個散列表(請參閱[這篇經典的PyCon討論](https://www.youtube.com/watch?v=C4Kc8xzcA68)以獲取更多信息),字典中的鍵查找是'O(1)'。 – jonrsharpe

+0

非常感謝您的回覆! –

回答

1

可以使用.get(..)指定默認值,如:

dic['key3'] = dic.get('key3',0) + 1

.get(key,default=None)執行詞典中查找。如果它找不到key,它將返回default

但我認爲在這種情況下,你最好使用Counter

from collections import Counter 

counter = Counter({'key1':3, 'key2':5}) 
counter['key3'] += 1

計數器假設,如果密鑰不存在於數據庫中,它的價值是零。

+1

是的,'Counter'比'defaultdict(int)'更好。 – jonrsharpe

+0

謝謝!當默認值爲零時'counter'工作得很好。但我認爲'dic ['key3'] = dic.get('key3',0)+ 1'仍然會檢查'dic'兩次並使用額外的內存。 –

+0

@ DongxuZhang:通常沒有'.get(..)'有它自己的高效實現:如果在'別名0'中的'key3'它比'dic ['key3']快。 'dic ['a'] + = 1'也會檢查字典兩次。 –