首页
学习
活动
专区
圈层
工具
发布

defaultdict
EN

Stack Overflow用户
提问于 2011-02-17 22:04:23
回答 6查看 109.9K关注 0票数 395

为了让下面的代码工作,有没有办法拥有一个defaultdict(defaultdict(int))

代码语言:javascript
复制
for x in stuff:
    d[x.a][x.b] += x.c_int

根据x.ax.b元素,需要临时构建d

我可以使用:

代码语言:javascript
复制
for x in stuff:
    d[x.a,x.b] += x.c_int

但这样我就不能使用:

代码语言:javascript
复制
d.keys()
d[x.a].keys()
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-02-17 22:06:20

是的,就像这样:

代码语言:javascript
复制
defaultdict(lambda: defaultdict(int))

当您试图访问一个不存在的键时,将调用defaultdict的参数(在本例中为lambda: defaultdict(int))。它的返回值将被设置为该键的新值,这意味着在我们的示例中,d[Key_doesnt_exist]的值将为defaultdict(int)

如果您试图访问最后一个默认字典中的键,即d[Key_doesnt_exist][Key_doesnt_exist],它将返回0,这是最后一个默认字典的参数的返回值,即int()

票数 711
EN

Stack Overflow用户

发布于 2011-02-17 22:08:34

defaultdict构造函数的参数是用于构建新元素的函数。因此,让我们使用lambda!

代码语言:javascript
复制
>>> from collections import defaultdict
>>> d = defaultdict(lambda : defaultdict(int))
>>> print d[0]
defaultdict(<type 'int'>, {})
>>> print d[0]["x"]
0

从Python2.7开始,就有了even better solution using Counter

代码语言:javascript
复制
>>> from collections import Counter
>>> c = Counter()
>>> c["goodbye"]+=1
>>> c["and thank you"]=42
>>> c["for the fish"]-=5
>>> c
Counter({'and thank you': 42, 'goodbye': 1, 'for the fish': -5})

一些额外的特性

代码语言:javascript
复制
>>> c.most_common()[:2]
[('and thank you', 42), ('goodbye', 1)]

有关更多信息,请参见PyMOTW - Collections - Container data typesPython Documentation - collections

票数 54
EN

Stack Overflow用户

发布于 2011-02-17 22:15:46

我发现使用partial稍微优雅一些。

代码语言:javascript
复制
import functools
dd_int = functools.partial(defaultdict, int)
defaultdict(dd_int)

当然,这和lambda是一样的。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5029934

复制
相关文章

相似问题

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