我有一个数据结构,基本上相当于嵌套字典.让我们说它看起来像这样:
{'new jersey': {'mercer county': {'plumbers': 3,
'programmers': 81},
'middlesex county': {'programmers': 81,
'salesmen': 62}},
'new york': {'queens county': {'plumbers': 9,
'salesmen': 36}}}
Run Code Online (Sandbox Code Playgroud)
现在,保持和创造这个是非常痛苦的; 每当我有一个新的州/县/专业时,我必须通过令人讨厌的try/catch块创建下层词典.而且,如果我想要遍历所有值,我必须创建恼人的嵌套迭代器.
我也可以使用元组作为键,如下:
{('new jersey', 'mercer county', 'plumbers'): 3,
('new jersey', 'mercer county', 'programmers'): 81,
('new jersey', 'middlesex county', 'programmers'): 81,
('new jersey', 'middlesex county', 'salesmen'): 62,
('new york', 'queens county', 'plumbers'): 9,
('new york', 'queens county', 'salesmen'): 36}
Run Code Online (Sandbox Code Playgroud)
这使得迭代值非常简单和自然,但是做聚合和查看字典的子集(例如,如果我只想逐个状态)这样做更具语法上的痛苦.
基本上,有时我想将嵌套字典视为平面字典,有时我想将其视为复杂的层次结构.我可以把它全部包装在一个类中,但似乎有人可能已经完成了这个.或者,似乎可能有一些非常优雅的语法结构来做到这一点.
我怎么能做得更好?
附录:我知道setdefault()
但它并没有真正实现干净的语法.此外,您创建的每个子词典仍需要setdefault()
手动设置.
使用深层嵌套的python dicts,我希望能够在这样的数据结构中分配值,如下所示:
mydict[key][subkey][subkey2]="value"
Run Code Online (Sandbox Code Playgroud)
无需检查mydict [key]等实际上是否设置为dict,例如使用
if not key in mydict: mydict[key]={}
Run Code Online (Sandbox Code Playgroud)
子代的创建应该在飞行中发生.什么是允许等价的最优雅方式 - 可能在标准上使用装饰器<type 'dict'>
?
想象一下你在python中有一本字典:myDic = {'a':1, 'b':{'c':2, 'd':3}}
.您当然可以将变量设置为键值并在以后使用它,例如:
myKey = 'b'
myDic[myKey]
>>> {'c':2, 'd':3}
Run Code Online (Sandbox Code Playgroud)
但是,有没有办法以某种方式将变量设置为一个值,当用作键时,它也将挖掘到子词典中?有没有办法在python中完成以下伪代码?
myKey = "['b']['c']"
myDic[myKey]
>>> 2
Run Code Online (Sandbox Code Playgroud)
所以首先它使用'b'作为键,然后重新调整它然后使用'c'作为关键.显然,如果从第一个查找返回的值不是字典,它将返回错误.