Python:defaultdict的defaultdict?
有没有办法让defaultdict(defaultdict(int))
为了使下面的代码工作?
for x in stuff: d[xa][xb] += x.c_int
d
需要特别build立,取决于xa
和xb
元素。
我可以使用:
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
这种方法的好处是,它很简单,可以轻松扩展。 如果你需要三层深度的映射,只需要使用一个三元组元组作为键。