动态访问嵌套字典键?

And*_*ius 5 python dictionary python-2.7

一开始您不知道要访问哪个键时,是否有一些简单的方法可以访问嵌套字典键?

例如:

dct = {'label': 'A', 'config': {'value': 'val1'}}
Run Code Online (Sandbox Code Playgroud)

在这本字典中,我需要访问另一个可通过键访问的字典中的label键或键。valueconfig

这取决于状态。

例如,如果我们有一个名为 的变量label,那么如果:

label = True
if label:
   key = 'label'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它很简单:

dct[key]
Run Code Online (Sandbox Code Playgroud)

现在,如果 label 为 false 并且我需要访问嵌套字典,我如何动态指定它以便我不需要在每个迭代项上使用 ifs(我的意思是每次检查 iflabel被使用而不是value,因为我会在开始迭代之前知道这一点在充满dct字典的字典上)?

喜欢:

label = False
if label:
   key = 'label'
else:
    key = 'config..?' # it should be something like ['config']['value']
Run Code Online (Sandbox Code Playgroud)

abu*_*lka 8

扩展@Barun的工作,并可能帮助回答@Bhavani在嵌套字典中重新设置值的问题,这里是动态访问或设置嵌套字典键的通用解决方案。Python 3.7。

from typing import List

class DynamicAccessNestedDict:
    """Dynamically get/set nested dictionary keys of 'data' dict"""

    def __init__(self, data: dict):
        self.data = data

    def getval(self, keys: List):
        data = self.data
        for k in keys:
            data = data[k]
        return data

    def setval(self, keys: List, val) -> None:
        data = self.data
        lastkey = keys[-1]
        for k in keys[:-1]:  # when assigning drill down to *second* last key
            data = data[k]
        data[lastkey] = val
Run Code Online (Sandbox Code Playgroud)

您只需将字典包装在此类的实例中,然后通过传递键列表来获取和设置。

dct = {'label': 'A', 'config': {'value': 'val1'}}

d = DynamicAccessNestedDict(dct)
assert d.getval(["label"]) == "A"
assert d.getval(["config", "value"]) == "val1"

# Set some new values
d.setval(["label"], "B")
d.setval(["config", "value"], "val2")

assert d.getval(["label"]) == "B"
assert d.getval(["config", "value"]) == "val2"
Run Code Online (Sandbox Code Playgroud)


Bar*_*rma 4

如果你知道要遍历的key,可以尝试下面的方法。这适用于任何级别的嵌套字典。

dct = {'label': 'A', 'config': {'value': 'val1'}}

label = True
key = ('label',)
if not label:
    key = ('config', 'value')

ret = dct
for k in key:
  ret = ret[k]

print ret
Run Code Online (Sandbox Code Playgroud)