在词典中分配嵌套键和值

T-8*_*800 2 python dictionary

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

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

Data[day1][e1] = 4 
Run Code Online (Sandbox Code Playgroud)

但是该Data[day1][e1] = 4命令不起作用(出于同样的原因test = {} ; test["foo"]["bar"] = 0).有没有解决方法来做到这一点?

我试着这样做:

me1 = {e1 : 4}
me2 = {e2 : 5}
Data = {day1 : me1}
Data = {day2 : me2}
Run Code Online (Sandbox Code Playgroud)

但我不能成功; 我写的所有东西都以某种方式覆盖了现有的价值观,或者不像我希望的那样.我可能错过了一些东西......

一些额外的注释:在begininng没有关于字典长度的任何信息,或它的确切外观.而不是值4,我将一个对象指定为值.我需要使用这样的结构(Data[day1][e1])因为我必须将对象分配给循环内的键.

Mar*_*ers 8

你需要在里面存储一个新的字典Data才能使它工作:

Data[day1] = {}
Data[day1][e1] = 4
Run Code Online (Sandbox Code Playgroud)

但通常你会先测试看那本字典是否存在; 使用dict.setdefault()以使之成为一个步骤的过程:

if day1 not in Data
    Data[day1] = {}
Data[day1][e1] = 4
Run Code Online (Sandbox Code Playgroud)

collections.defaultdict()类型自动化该过程:

from collections import defaultdict

Data = defaultdict(dict)
Data[day1][e1] = 4
Run Code Online (Sandbox Code Playgroud)

day1键不存在,但defaultdict()随后对象调用构造函数配置(dict在这里),根据需要为关键产生新的价值.

  • @BenFarmer:将其扩展到无限级别称为 *auto-vivification*,您只需要一个单独的工厂:`factory = lambda: defaultdict(factory)`,然后是 `data = defaultdict(factory)`。注意工厂的递归定义.. (2认同)