Answers:
是这样的:
defaultdict(lambda: defaultdict(int))
当您尝试访问不存在的键时,将调用的参数defaultdict
(在这种情况下为lambda: defaultdict(int)
)。它的返回值将设置为该密钥的新值,这意味着在我们的情况下,d[Key_doesnt_exist]
将为defaultdict(int)
。
如果尝试从最后一个defaultdict访问密钥,即d[Key_doesnt_exist][Key_doesnt_exist]
它将返回0,这是最后一个defaultdict的参数的返回值int()
。
defaultdict
(在这种情况下为lambda : defaultdict(int)
)的参数,并且其返回值将设置为该键的新值,这意味着在我们的例子中,值d[Key_dont_exist]
将为defaultdict(int)
,如果您尝试从最后一个defaultdict访问键,即d[Key_dont_exist][Key_dont_exist]
它将返回0,这是最后一个defaultdict
ie 的参数的返回值int()
,希望对您有所帮助。
defaultdict
应该是一个函数。defaultdict(int)
是字典,lambda: defaultdict(int)
而是返回字典的函数。
defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
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文档-集合
d = defaultdict(lambda : Counter())
而不是d = defaultdict(lambda : defaultdict(int))
专门解决最初提出的问题。
d = defaultdict(Counter())
在这种情况下,您无需使用lambda即可
Counter
对象而不是对象。那是:d = defaultdict(Counter)
作为参考,可以通过以下方式实现通用的嵌套defaultdict
工厂方法:
from collections import defaultdict
from functools import partial
from itertools import repeat
def nested_defaultdict(default_factory, depth=1):
result = partial(defaultdict, default_factory)
for _ in repeat(None, depth - 1):
result = partial(defaultdict, result)
return result()
深度定义了default_factory
使用中定义的类型之前嵌套字典的数量。例如:
my_dict = nested_defaultdict(list, 3)
my_dict['a']['b']['c'].append('e')
ndd = nested_defaultdict(dict) .... ndd['a']['b']['c']['d'] = 'e'
掷KeyError: 'b'
depth=0
,如果调用时深度未知,则可能并不总是需要这样。通过if not depth: return default_factory()
在函数顶部添加line可以轻松修复,尽管可能存在更优雅的解决方案。
先前的答案已经解决了如何制作两级或n级defaultdict
。在某些情况下,您需要无限个:
def ddict():
return defaultdict(ddict)
用法:
>>> d = ddict()
>>> d[1]['a'][True] = 0.5
>>> d[1]['b'] = 3
>>> import pprint; pprint.pprint(d)
defaultdict(<function ddict at 0x7fcac68bf048>,
{1: defaultdict(<function ddict at 0x7fcac68bf048>,
{'a': defaultdict(<function ddict at 0x7fcac68bf048>,
{True: 0.5}),
'b': 3})})
其他人已经正确回答了您如何使以下各项正常工作的问题:
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
这种方法的好处是它很简单并且可以轻松扩展。如果您需要三个层次的映射,只需使用一个三项元组作为键。