我有一个数据结构,基本上相当于嵌套字典.让我们说它看起来像这样:
{'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()手动设置.
我有一个复杂的字典结构,我想通过一个键列表访问,以解决正确的项目.
dataDict = {
"a":{
"r": 1,
"s": 2,
"t": 3
},
"b":{
"u": 1,
"v": {
"x": 1,
"y": 2,
"z": 3
},
"w": 3
}
}
maplist = ["a", "r"]
Run Code Online (Sandbox Code Playgroud)
要么
maplist = ["b", "v", "y"]
Run Code Online (Sandbox Code Playgroud)
我已经制作了以下代码,但是我确信如果有人有想法,有更好更有效的方法.
# Get a given data from a dictionary with position provided as a list
def getFromDict(dataDict, mapList):
for k in mapList: dataDict = dataDict[k]
return dataDict
# Set a given data in a dictionary with position provided as a list
def …Run Code Online (Sandbox Code Playgroud) 使用深层嵌套的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 字典键列表:
['level_one', 'level_two', 'test']
这些是字典的键:
mydict = {
'level_one' : {
'level_two' : {
'test' : "Hello World"
}
}
}
Run Code Online (Sandbox Code Playgroud)
通常我可以这样设置test键:
mydict['level_one']['level_two']['test'] = "Hello StackOverflow"
不幸的是,列表/字典是即时生成的,我不知道它能走多远。是否有可能在不使用大括号的情况下通过键列表更新 dict 键?
我只能反映这个获取字符串的功能:
def deepGet(sourceDict, *keys):
return reduce(lambda d, k: d.get(k) if d else None, keys, sourceDict)
> deepGet(mydict, *['level_one', 'level_two', 'test'])
>> Hello World
Run Code Online (Sandbox Code Playgroud)
不是重复的。这是关于设置,而不是获取嵌套字典。
这个主题并不新鲜,已经在多个帖子中讨论过(链接位于底部)。然而,我觉得资源分散,并不总是清楚什么是最好的方法。我还想引入一些约束来明确定义我期望的行为。
假设我们有一个包含任意数量的项目和任意深度的嵌套字典:
d = {"a": {"b": {"c" : 0}},
"b": {"c" : 1},
"c": 2}
Run Code Online (Sandbox Code Playgroud)
获取其物品的最佳方式是什么?
这种简单的方法相当麻烦,尤其是当有很多嵌套级别时。
>>> d["a"]["b"]["c"]
0
Run Code Online (Sandbox Code Playgroud)
因此,第一个约束是要获取的项的键必须以元组的形式提供,例如:
key = ("a", "b", "c")
Run Code Online (Sandbox Code Playgroud)
现在的目标是创建一些工作原理如下的函数:
>>> getitem(d, key)
0
Run Code Online (Sandbox Code Playgroud)
这种格式也可以方便地直接应用为__getitem__类的方法。
还有一个限制:我希望该函数在被要求获取不存在的密钥时大声失败。
>>> getitem(d, ("asd",))
...
KeyError: 'asd'
Run Code Online (Sandbox Code Playgroud)
这排除了所有使用项目获取来使字典生动的解决方案。
最后,如果可能,请提供低级代码。如果您知道解决此问题的包,请解释底层机制。
参考
我有一个深嵌套的dict(从json解码,来自instagram api).我的初始代码是这样的:
caption = post['caption']['text']
Run Code Online (Sandbox Code Playgroud)
但是如果'caption'键或'text'键不存在,那将抛出NoneType或KeyError错误.
所以我想出了这个:
caption = post.get('caption', {}).get("text")
Run Code Online (Sandbox Code Playgroud)
哪个有效,但我不确定它的风格.例如,如果我将此技术应用于我正在尝试检索的更深层次的嵌套属性之一,它看起来非常难看:
image_url = post.get('images',{}).get('standard_resolution',{}).get('url')
Run Code Online (Sandbox Code Playgroud)
有没有更好,更pythonic的方式来写这个?我的目标是检索数据(如果有的话),但如果数据不存在则不会阻止执行.
谢谢!
array = {"key1":{"key2":"value"}}
if 'key1' in array:
if 'key2' in array['key1']:
print(array['key1']['key2'])
else
print(0)
Run Code Online (Sandbox Code Playgroud)
在php中是这样的if(isset(array[key1][key2]))。
python ×7
dictionary ×6
decorator ×1
keyerror ×1
list ×1
mapping ×1
nested ×1
nonetype ×1
python-2.7 ×1
styles ×1