首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python如何使用defaultdict创建一个dict of list

Python如何使用defaultdict创建一个dict of list
EN

Stack Overflow用户
提问于 2015-10-12 12:14:27
回答 3查看 8.3K关注 0票数 9

如何使用defaultdict创建一个dict列表?我得到了以下错误。

代码语言:javascript
复制
>>> 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-12 12:28:53

有点棘手。您将默认设置为defaultdicts,如下所示:

代码语言:javascript
复制
defaultdict(lambda: defaultdict(list))
票数 20
EN

Stack Overflow用户

发布于 2016-03-02 22:28:36

略快于使用lambda

代码语言:javascript
复制
defaultdict(defaultdict(list).copy)

这与wim's answer具有相同的可观察行为,但避免了lambda,而倾向于用C实现(在CPython中)绑定内建方法,这意味着默认值生成不必执行任何Python字节代码或查找任何名称,而且运行速度较快。在CPython 3.5上的微基准中,当在访问时不存在密钥时所支付的成本似乎比其他等价的lambda低5-10%。

实际上,我之所以喜欢它,是因为我讨厌lambda,因为当它是个坏主意时,人们会过度使用它(例如,map/filterlambda的关系总是比等效的listcomp/genexpr更冗长、更慢,但人们无论如何都会这么做,没有明显的原因),尽管在这种情况下,这并不重要。

更新:在3.8岁时,这种性能改进已经消失,lambda更快(在3.8上使用lambda的运行时减少了3%,在3.9上减少了7%),用于使用ipython的简单微基准测试。如果你想复制我的测试,我测试:

代码语言:javascript
复制
>>> 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中查找defaultdictlist的成本,从完整的dict查找(在内置的list中为两个)到快速检查dict上的版本标记,然后从缓存中获取一个廉价的负载,降低了40%的成本。3.9的改进可能(在这一点上不确定)与CPython的内部结构有关,它更多地优化和偏爱向量化调用代码路径,而牺牲了非向量化调用代码路径(相对地说,defaultdict(list).copy路径更多地使用这种路径),甚至在这些改进之前,defaultdict(list).copy就有一些lambda所缺乏的低效,为改进它提供了一些空间。

票数 11
EN

Stack Overflow用户

发布于 2015-10-12 12:15:57

你可能得这样做。

代码语言:javascript
复制
>>> 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']})})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33080869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档