Python:defaultdict的defaultdict?


Answers

defaultdict构造函数的参数是为构建新元素而调用的函数。 所以让我们使用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更好的解决方案

>>> 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 - 集合 - 容器数据类型Python文档 - 集合

Question

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

for x in stuff:
    d[x.a][x.b] += x.c_int

d需要根据xaxb元素进行临时构建。

我可以使用:

for x in stuff:
    d[x.a,x.b] += x.c_int

但后来我无法使用:

d.keys()
d[x.a].keys()



其他人已经正确回答了你如何使以下内容发挥作用的问题:

for x in stuff:
    d[x.a][x.b] += x.c_int

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

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

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






Related