带默认值的嵌套字典
Nested dictionary with defaults
有没有办法制作一个嵌套字典,这样我可以说 mydict[x][y][z] += 1
,其中 mydict[x][y][z]
以前不存在,默认为 0(递增后为 1)?
我调查了一个类似问题的答案,您可以在其中使用 collections
class (Declaring a multi dimensional dictionary in python) 中的 defaultdict
说 mydict[x][y][z] = 1
,但是这不允许您假定默认值然后递增。
是的,您可以使用 collections
模块来做到这一点:
from collections import defaultdict, Counter
d = defaultdict(lambda: defaultdict(lambda: Counter()))
d['A']['B']['C'] += 1
# defaultdict(<function __main__.<lambda>>,
# {'A': defaultdict(<function __main__.<lambda>.<locals>.<lambda>>,
# {'B': Counter({'C': 1})})})
请注意,这也可以通过仅使用嵌套 defaultdict
:
d = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
但是,鉴于 Counter
是为递增整数的特定目的而创建的,这将是我更喜欢的方法。
有没有办法制作一个嵌套字典,这样我可以说 mydict[x][y][z] += 1
,其中 mydict[x][y][z]
以前不存在,默认为 0(递增后为 1)?
我调查了一个类似问题的答案,您可以在其中使用 collections
class (Declaring a multi dimensional dictionary in python) 中的 defaultdict
说 mydict[x][y][z] = 1
,但是这不允许您假定默认值然后递增。
是的,您可以使用 collections
模块来做到这一点:
from collections import defaultdict, Counter
d = defaultdict(lambda: defaultdict(lambda: Counter()))
d['A']['B']['C'] += 1
# defaultdict(<function __main__.<lambda>>,
# {'A': defaultdict(<function __main__.<lambda>.<locals>.<lambda>>,
# {'B': Counter({'C': 1})})})
请注意,这也可以通过仅使用嵌套 defaultdict
:
d = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
但是,鉴于 Counter
是为递增整数的特定目的而创建的,这将是我更喜欢的方法。