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

Posted

技术标签:

【中文标题】如何在 Python 中初始化嵌套字典【英文标题】:How to initialize nested dictionaries in Python 【发布时间】:2013-03-27 00:18: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)

另外,如果内部 dict 本身应该初始化为一个列表呢?

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】:

使用setdefault:

如果键在字典中,则返回其值。如果不是,则插入值为默认值的键并返回默认值。

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'

【讨论】:

在内部 dict 案例中的列表是否有类似 defaultdict 的东西? 只是在编辑它。您只需要一个返回 defaultdict(list) 的函数,而不仅仅是 丢失键。【参考方案2】:
from collections import defaultdict
format_to_year_to_value_dict = defaultdict(dict)

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

【讨论】:

以上是关于如何在 Python 中初始化嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章

如何在Python中更改嵌套字典中键的值[关闭]

如何在 Python 中遍历 N 级嵌套字典?

如何在嵌套的 Python 字典中搜索匹配的数据框值,然后更新数据框?

python如何读取嵌套字典里的值?

你如何在 Python 中创建嵌套字典?

如何从 2 个 pkl 文件创建 Python 嵌套字典/将 2 个嵌套字典合并为一个?