在字典中分配嵌套键和值

7

我需要将嵌套值分配给字典。为了便于理解,我简化了我的问题:

Data = {}   
day1 = 'March12'
day2 = 'March14'
e1 = 'experiment1'
e2 = 'experiment2'

Data[day1][e1] = 4 

但是Data[day1][e1] = 4命令无法运行(与test = {} ; test["foo"]["bar"] = 0相同的原因)。有没有解决方法?

我尝试过类似以下的操作:

me1 = {e1 : 4}
me2 = {e2 : 5}
Data = {day1 : me1}
Data = {day2 : me2}

但是我没有成功;所有我写的东西都以某种方式覆盖了已有的值或者不如我所愿。我可能漏掉了什么......
一些额外的注释:一开始没有关于字典长度或其具体样子的任何信息。而且,我会将一个对象分配为一个值,而不是值“4”。我需要使用这样的结构(Data[day1][e1]),因为我必须在循环内为它们的键分配对象。
2个回答

17
你需要在Data内存储一个新的字典来使其起作用:
Data[day1] = {}
Data[day1][e1] = 4

但通常您需要先测试该字典是否已存在。使用 dict.setdefault() 可将其变为一步过程:

if day1 not in Data
    Data[day1] = {}
Data[day1][e1] = 4

collections.defaultdict()类型可以自动化此过程:

from collections import defaultdict

Data = defaultdict(dict)
Data[day1][e1] = 4

defaultdict()对象会调用事先配置的构造函数(这里是dict)来为需要的键生成新值,因此day1键尚不存在。


1
这对于单个级别来说很酷,但是它能轻松地推广到许多级别吗?我猜defaultdict(defaultdict(dict))只能为我们提供一个额外的级别? - Ben Farmer
3
@BenFarmer:将其扩展到无限级别称为自动生成功能,您只需要一个单独的工厂:factory = lambda: defaultdict(factory),然后 data = defaultdict(factory)。请注意工厂的递归定义。 - Martijn Pieters

4

你需要为每个键创建一个空字典,例如

Data = {}

Data['day1'] = {}

Data['day1']['e1'] = 4


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