如何在Python中初始化嵌套字典

11

我正在使用Python v2.7的字典,像这样嵌套一个字典到另一个字典中:

def example(format_str, year, value):
  format_to_year_to_value_dict = {}
  # In the actual code there are many format_str and year values,
  # not just the one inserted here.
  if not format_str in format_to_year_to_value_dict:
    format_to_year_to_value_dict[format_str] = {}
  format_to_year_to_value_dict[format_str][year] = value

在将第一级字典插入第二级字典之前,使用空字典进行初始化似乎有些笨拙。如果第一级字典不存在,是否有一种方法可以同时设置值并创建第一级字典?我想象中的解决方案避免了条件式初始化:

def example(format_str, year, value):
  format_to_year_to_value_dict = {}
  add_dict_value(format_to_year_to_value_dict[format_str], year, value)

另外,如果内部字典本身应该初始化为列表,该怎么办?

def example(format_str, year, value):
  format_to_year_to_value_dict = {}
  # In the actual code there are many format_str and year values,
  # not just the one inserted here.
  if not format_str in format_to_year_to_value_dict:
    format_to_year_to_value_dict[format_str] = {}
  if not year in format_to_year_to_value_dict[format_str]:
    format_to_year_to_value_dict[format_str][year] = []
  format_to_year_to_value_dict[format_str][year].append(value)
2个回答

16

使用setdefault方法:

若键 key 已经在字典中,则返回其对应的值;否则,将 key 作为键,default 作为默认值插入字典,并返回 default。

format_to_year_to_value_dict.setdefault(format_str, {})[year] = value

或者使用collections.defaultdict:
format_to_year_to_value_dict = defaultdict(dict)
...
format_to_year_to_value_dict[format_str][year] = value

在内部字典中有列表:

def example(format_str, year, value):
  format_to_year_to_value_dict = {}

  format_to_year_to_value_dict.setdefault(format_str, {}).setdefault(year, []).append(value)


def example(format_str, year, value):
  format_to_year_to_value_dict = defaultdict(lambda: defaultdict(list))

  format_to_year_to_value_dict[format_str][year].append(value)

对于未知深度的字典,您可以使用这个小技巧:
tree = lambda: defaultdict(tree)

my_tree = tree()
my_tree['a']['b']['c']['d']['e'] = 'whatever'

在内部字典的情况下,是否有类似于defaultdict的东西可以用于列表? - WilliamKF
刚刚在编辑那个。你只需要一个返回defaultdict(list)而不是{}的函数来处理缺失的键。 - Pavel Anossov
“tree”解决方案非常巧妙。如果想要一个稍微不那么hacky的版本,但是完全相同,请考虑使用“def tree(): return defaultdict(tree)”。 - Kaligule

3
from collections import defaultdict
format_to_year_to_value_dict = defaultdict(dict)

这将创建一个字典,当你访问不存在的键时会调用 dict()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接