Python如何使用defaultdict创建列表dict的dict

fil*_*ble 4 python dictionary data-structures defaultdict

如何使用defaultdict创建列表字典?我收到以下错误.

>>> from collections import defaultdict
>>> a=defaultdict()
>>> a["testkey"]=None
>>> a
defaultdict(None, {'testkey': None})
>>> a["testkey"]["list"]=[]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)

wim*_*wim 9

这有点棘手.你创建了defaultdicts的defaultdict,如下所示:

defaultdict(lambda: defaultdict(list))
Run Code Online (Sandbox Code Playgroud)

  • 这完全没问题(投票赞成),但是因为我有一种病态,即尽可能避免使用“lambda”函数(在总有更好的选择的情况下,它们经常被滥用,例如将“map”/“filter”与“ lambda` 总是比内联 `lambda` 主体的 listcomp/genexpr 慢;我对上述滥用的反应是尽可能避免它们),这种方法使用空 `defaultdict(list)` 的绑定方法来避免`lambda` 并将所有工作推送到 C 层,这(速度快了 5-10%)提高了运行速度: `defaultdict(defaultdict(list).copy)` (2认同)

Sha*_*ger 8

比使用一个快一点lambda:

defaultdict(defaultdict(list).copy)
Run Code Online (Sandbox Code Playgroud)

这与wim的答案具有相同的可观察行为,但避免lambda支持在C中实现的(在CPython中)绑定的内置方法,这意味着默认值生成不必执行任何Python字节代码或查找任何名称,它运行速度较快.在微基准测试中,看起来当访问时不存在密钥时所支付的成本比其他方式低约5-10%lambda.

说真的,我之所以喜欢它,是因为我讨厌lambda由于人们过度使用它时,它是一个坏主意(例如,map/ filterlambda总是比同等listcomp/genexpr更详细和更慢,但不断有人无论如何做它没有明显的理由),尽管在这种情况下它几乎不重要.