Python:defaultdict的defaultdict?

有没有办法让defaultdict(defaultdict(int))为了使下面的代码工作?

 for x in stuff: d[xa][xb] += x.c_int 

d需要特别build立,取决于xaxb元素。

我可以使用:

 for x in stuff: d[xa,xb] += x.c_int 

但后来我无法使用:

 d.keys() d[xa].keys() 

是这样的:

 defaultdict(lambda : defaultdict(int)) 

defaultdict构造函数的参数是为构build新元素而调用的函数。 所以我们来使用lambda!

 >>> from collections import defaultdict >>> d = defaultdict(lambda : defaultdict(int)) >>> print d[0] defaultdict(<type 'int'>, {}) >>> print d[0]["x"] 0 

从Python 2.7开始, 使用Counter有更好的解决scheme :

 >>> 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}) 

一些奖金function

 >>> c.most_common()[:2] [('and thank you', 42), ('goodbye', 1)] 

有关更多信息,请参阅PyMOTW – 集合 – 容器数据types和Python文档 – 集合

我发现它使用partial稍微优雅:

 import functools dd_int = functools.partial(defaultdict, int) defaultdict(dd_int) 

当然,这和lambda是一样的。

其他人已经正确回答了你如何使下面的工作的问题:

 for x in stuff: d[xa][xb] += x.c_int 

另一种方法是使用元组作为键:

 d = defaultdict(int) for x in stuff: d[xa,xb] += x.c_int # ^^^^^^^ tuple key 

这种方法的好处是,它很简单,可以轻松扩展。 如果你需要三层深度的映射,只需要使用一个三元组元组作为键。