为了让下面的代码工作,有没有办法拥有一个defaultdict(defaultdict(int))?
for x in stuff:
d[x.a][x.b] += x.c_int根据x.a和x.b元素,需要临时构建d。
我可以使用:
for x in stuff:
d[x.a,x.b] += x.c_int但这样我就不能使用:
d.keys()
d[x.a].keys()发布于 2011-02-17 22:06:20
是的,就像这样:
defaultdict(lambda: defaultdict(int))当您试图访问一个不存在的键时,将调用defaultdict的参数(在本例中为lambda: defaultdict(int))。它的返回值将被设置为该键的新值,这意味着在我们的示例中,d[Key_doesnt_exist]的值将为defaultdict(int)。
如果您试图访问最后一个默认字典中的键,即d[Key_doesnt_exist][Key_doesnt_exist],它将返回0,这是最后一个默认字典的参数的返回值,即int()。
发布于 2011-02-17 22:08:34
defaultdict构造函数的参数是用于构建新元素的函数。因此,让我们使用lambda!
>>> 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
>>> 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})一些额外的特性
>>> c.most_common()[:2]
[('and thank you', 42), ('goodbye', 1)]有关更多信息,请参见PyMOTW - Collections - Container data types和Python Documentation - collections
发布于 2011-02-17 22:15:46
我发现使用partial稍微优雅一些。
import functools
dd_int = functools.partial(defaultdict, int)
defaultdict(dd_int)当然,这和lambda是一样的。
https://stackoverflow.com/questions/5029934
复制相似问题