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

时间:2013-04-04 18:55:02

标签: python dictionary python-2.7 initialization nested

我正在使用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 个答案:

答案 0 :(得分:12)

使用setdefault

  

如果键在词典中,则返回其值。如果没有,请插入值为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'

答案 1 :(得分:3)

from collections import defaultdict
format_to_year_to_value_dict = defaultdict(dict)

当您访问不存在的密钥时,这将创建一个调用dict()的字典。