![](/img/trans.png)
[英]clarify behaviour: collections.defaultdict vs dict.setdefault
[英]Replace collections' defaultdict by a normal dict with setdefault
我經常使用collections.defaultdict
能夠將一個元素 append 到d[key]
而不必先將其初始化為[]
(好處:你不需要做: if key not in d: d[key] = []
):
import collections, random
d = collections.defaultdict(list)
for i in range(100):
j = random.randint(0,20)
d[j].append(i) # if d[j] does not exist yet, initialize it to [], so we can use append directly
現在我意識到我們可以簡單地使用普通的dict
和setdefault
:
import random
d = {}
for i in range(100):
j = random.randint(0,20)
d.setdefault(j, []).append(i)
問題:當使用值為列表的dict
時,是否有充分的理由使用collections.defaultdict
而不是第二種方法(使用簡單的dict
和setdefault
),還是它們完全等效?
collections.defaultdict
通常性能更高,它針對此任務進行了優化並由 C 語言實現。 但是,如果要訪問結果字典中缺少的鍵以導致KeyError
而不是插入空列表,則應使用dict.setdefault
。 這是最重要的實際區別。
除了 Chris_Rands 的回答之外,我想進一步強調,使用defaultdict
的一個主要原因是如果您希望密鑰訪問始終成功,並且如果沒有,則插入默認值。 這可能是出於任何原因,一個完全有效的原因是能夠使用[]
而不必在每次訪問之前調用dict.setdefault
。
另請注意,如果以前從未訪問過該key in default_dict
中的鍵仍將返回False
,因此您仍然可以在必要時檢查defaultdict
中的鍵是否存在。 這允許在不檢查列表是否存在的情況下附加到列表,但如果需要,還可以檢查列表的存在。
使用defaultdict
時,您可以進行就地添加:
import collections, random
d = collections.defaultdict(list)
for i in range(100):
j = random.randint(0,20)
d[j] += [i]
沒有像d.setdefault(j, []) += [i]
這樣的等效結構,它給出SyntaxError: cannot assign to function call
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.