如何使用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
答案 0 :(得分:9)
这有点棘手。你创建了defaultdicts的默认用法,如下所示:
defaultdict(lambda: defaultdict(list))
答案 1 :(得分:7)
比使用lambda
:
defaultdict(defaultdict(list).copy)
这与wim's answer具有相同的可观察行为,但避免lambda
支持在C中实现的(在CPython中)绑定的内置方法,这意味着默认值生成不会出现。必须执行任何Python字节代码或查找任何名称,它运行速度较快。在微基准测试中,看起来当访问时不存在密钥时所支付的成本比其他等效的lambda
低约5-10%。
真的,我之所以喜欢它,是因为我讨厌lambda
,因为当人们过分使用它时(例如map
/ filter
lambda
总是比同等的listcomp / genexpr更冗长,更慢,但是人们总是这样做,因为没有明显的原因),尽管在这种情况下它几乎不重要。
答案 2 :(得分:2)
你可能必须这样做。
>>> from collections import defaultdict
>>> a=defaultdict()
>>> a["testkey"]=None
>>> a["testkey"]=defaultdict(list)
>>> a["testkey"]["list"]=["a","b","c"]
>>> a
defaultdict(None, {'testkey': defaultdict(<type 'list'>, {'list': ['a', 'b', 'c']})})