How to initialize nested dictionaries in Python

时间秒杀一切 提交于 2019-12-08 15:59:00

问题


I'm using Python v2.7 dictionaries, nested one inside another like this:

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

It seems a bit clumsy to initialize the first level dictionary with an empty dictionary before inserted into the second level dictionary. Is there a way to set a value while at the same time creating a dictionary at the first level if there is not one already there? I imagine something like this to avoid the conditional initializer:

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)

Also, what if the inner dict should itself initialize to a list?

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)

回答1:


Use setdefault:

If key is in the dictionary, return its value. If not, insert key with a value of default and return default.

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

 

Or collections.defaultdict:

format_to_year_to_value_dict = defaultdict(dict)
...
format_to_year_to_value_dict[format_str][year] = value

With lists in the inner dict:

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)

or

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)

For dicts of unknown depth, you can use this little trick:

tree = lambda: defaultdict(tree)

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



回答2:


from collections import defaultdict
format_to_year_to_value_dict = defaultdict(dict)

This will create a dictionary that calls dict() when you access keys that don't exist.



来源:https://stackoverflow.com/questions/15819428/how-to-initialize-nested-dictionaries-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!