Python:list()作为字典的默认值

Fys*_*ysx 22 python dictionary default-value

我有Python代码,看起来像:

if key in dict:
  dict[key].append(some_value)
else:
  dict[key] = [some_value]
Run Code Online (Sandbox Code Playgroud)

但我认为应该有一些方法可以绕过这个'if'语句.我试过了

dict.setdefault(key, [])
dict[key].append(some_value)
Run Code Online (Sandbox Code Playgroud)

dict[key] = dict.get(key, []).append(some_value)
Run Code Online (Sandbox Code Playgroud)

但两人都抱怨"TypeError:unhashable type:'list'".有什么建议?谢谢!

Mar*_*ers 54

最好的方法是使用collections.defaultdict一个list默认值:

from collections import defaultdict
dct = defaultdict(list)
Run Code Online (Sandbox Code Playgroud)

然后使用:

dct[key].append(some_value)
Run Code Online (Sandbox Code Playgroud)

如果密钥尚未出现在映射中,字典将为您创建一个新列表.collections.defaultdict是一个子类,dict并且行为与普通dict对象一样.

使用标准时dict,dict.setdefault()正确设置dct[key]为默认值,以便版本应该正常工作.你可以用以下方式链接该呼叫.append():

>>> dct = {}
>>> dct.setdefault('foo', []).append('bar')  # returns None!
>>> dct
{'foo': ['bar']}
Run Code Online (Sandbox Code Playgroud)

但是,通过使用dct[key] = dct.get(...).append()替换dct[key]输出.append(),即None.

  • 该解决方案将我的执行时间从2小时减少到15分钟。我的词典非常大,当它们达到3000万条目时,由于所有检查密钥是否已经存在,它们的速度都会降低。同样值得注意的是,我使用的是networkx图,但是内存开销却很可笑。现在,使用默认字典,使用默认词典,将需要180GB加载到RAM中的同一图形现在所花费的空间不到20GB。你救了一条命 (3认同)