如何使用defaultdict创建一个dict列表?我得到了以下错误。
>>> 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发布于 2015-10-12 12:28:53
有点棘手。您将默认设置为defaultdicts,如下所示:
defaultdict(lambda: defaultdict(list))发布于 2016-03-02 22:28:36
略快于使用lambda
defaultdict(defaultdict(list).copy)这与wim's answer具有相同的可观察行为,但避免了lambda,而倾向于用C实现(在CPython中)绑定内建方法,这意味着默认值生成不必执行任何Python字节代码或查找任何名称,而且运行速度较快。在CPython 3.5上的微基准中,当在访问时不存在密钥时所支付的成本似乎比其他等价的lambda低5-10%。
实际上,我之所以喜欢它,是因为我讨厌lambda,因为当它是个坏主意时,人们会过度使用它(例如,map/filter与lambda的关系总是比等效的listcomp/genexpr更冗长、更慢,但人们无论如何都会这么做,没有明显的原因),尽管在这种情况下,这并不重要。
更新:在3.8岁时,这种性能改进已经消失,lambda更快(在3.8上使用lambda的运行时减少了3%,在3.9上减少了7%),用于使用ipython的简单微基准测试。如果你想复制我的测试,我测试:
>>> from collections import defaultdict
>>> %%timeit dd = defaultdict(lambda: defaultdict(list)); o = object
... dd[o()]
>>> %%timeit dd = defaultdict(defaultdict(list).copy); o = object
... dd[o()]缓存o = object使查找开销最小化,并允许我们在不做其他工作的情况下,制作非常便宜、有保证的唯一访问密钥(强制list自动生动化)。
3.8版的性能改进很大程度上是由于引入了 instruction,从而降低了在lambda中查找defaultdict和list的成本,从完整的dict查找(在内置的list中为两个)到快速检查dict上的版本标记,然后从缓存中获取一个廉价的负载,降低了40%的成本。3.9的改进可能(在这一点上不确定)与CPython的内部结构有关,它更多地优化和偏爱向量化调用代码路径,而牺牲了非向量化调用代码路径(相对地说,defaultdict(list).copy路径更多地使用这种路径),甚至在这些改进之前,defaultdict(list).copy就有一些lambda所缺乏的低效,为改进它提供了一些空间。
发布于 2015-10-12 12:15:57
你可能得这样做。
>>> 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']})})https://stackoverflow.com/questions/33080869
复制相似问题