如果子密钥不存在,则从dicts的dict返回父值

时间:2014-09-22 19:30:27

标签: python dictionary parent-child parent

在下面的字典中,我希望能够从value属性中提取subkey*。但是,如果subkey*不存在,我想自动返回父value

d = {
'key1' : {
    'value': "parent-key1",
    'subkey1': {
        'value': "child1"
    },
    'subkey2': {
        'value': "child2"
    }
},
'key2': {
    'value': "parent-key2",
    'subkey1': {
        'value': "child3"
    },
    'subkey2': {
        'value': "child4"
    }
}

}

我的函数存根看起来像这样:

def get_values(my_dict_value):
    try:
        return my_dict_value
    except KeyError:
        # How do I find the parent value of my_dict_value?

我的预期结果是:

>>> get_values(d['key1']['subkey1']['value'])
child1
>>> get_values(d['key1']['subkey3']['value'])
parent-key1

如何在字典中找到父值?

2 个答案:

答案 0 :(得分:1)

以下是使用get方法解决嵌套字典的另一种方法:

>>>
>>> d = {
... 'key1' : {
...     'value': "parent-key1",
...     'subkey1': {
...         'value': "child1"
...     },
...     'subkey2': {
...         'value': "child2"
...     }
... },
... 'key2': {
...     'value': "parent-key2",
...     'subkey1': {
...         'value': "child3"
...     },
...     'subkey2': {
...         'value': "child4"
...     }
... }}
>>>
>>> def get_value(key, subkey):
...     dkey = d.get(key)
...     return dkey.get(subkey, {}).get('value', dkey.get('value'))
...
>>> print get_value("key1", "subkey1")
child1
>>> print get_value("key2", "subkey2")
child4
>>> print get_value("key2", "subkey3")
parent-key2
>>>

答案 1 :(得分:0)

作为SethMMorton mentions,您的当前方法将在它到达函数之前抛出一个键错误。

您可以通过将两个值传递给您的函数来解决此问题 - parentchild。因为你的例子显示两者都使用了value的密钥,所以我放弃了需要传递的第三个。该功能可以自动处理。

def get_values(key, subkey):
    try:
        return d[key][subkey]['value']     
    except KeyError:
        try:
            return d[key]['value']
        except KeyError:
            return "Not found"

这利用了嵌套异常,如果你比那些更深入,它会变得非常混乱。但是,外try块会尝试返回您的parent / child / value。如果不存在,则会尝试返回parent / value。如果不存在,则返回Not found

您可以这样称呼它:

print get_values("key1", "subkey1")
print get_values("key1", "subkey3")
print get_values("key4", "subkey1")

输出:

child1
parent-key1
Not found