簡體   English   中英

將集合的 defaultdict 替換為具有 setdefault 的普通 dict

[英]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

現在我意識到我們可以簡單地使用普通的dictsetdefault

import random
d = {}
for i in range(100):
    j = random.randint(0,20)
    d.setdefault(j, []).append(i)

問題:當使用值為列表的dict時,是否有充分的理由使用collections.defaultdict而不是第二種方法(使用簡單的dictsetdefault ),還是它們完全等效?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM