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

时间:2015-10-12 12:14:27

标签: 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

3 个答案:

答案 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']})})