【问题标题】:I have list which have keys of dictionary. How to access the dictionary using these keys dynamically我有包含字典键的列表。如何使用这些键动态访问字典
【发布时间】:2016-02-03 09:02:32
【问题描述】:

我有一个包含字典键的列表。如何使用这些键动态访问字典。例如

key_store = ['test','test1']

mydict = {"test":{'test1':"value"},"test3":"value"}

那么如何使用key_store访问mydict我想访问mydict['test']['test1']

注意:key_store 存储关键字的深度意味着它只有关键字,它的值将是字典,如 test 有字典,所以它有 'test','test1'

【问题讨论】:

  • 上述测试用例需要什么输出?

标签: python python-2.7


【解决方案1】:

使用递归:

def get_value(d, k, i):
    if not isinstance(d[k[i]], dict):
        return d[k[i]]
    return get_value(d[k[i]], k, i+1)

参数是字典、列表和您将在其上运行的索引。

停止条件很简单;一旦值不是字典,您就想返回它,否则您将继续在字典中遍历列表中的下一个元素。


>>> key_store = ['test','test1']
>>> Dict = {"test":{'test1':"value"},"test3":"value"}
>>> def get_value(d, k, i):
...     if isinstance(d[k[i]], str):
...         return d[k[i]]
...     return get_value(d[k[i]], k, i+1)
...
>>> get_value(Dict, key_store, 0)
'value'

【讨论】:

  • @user3048148 不客气。不要只是“检查”,尝试理解更重要。
  • 另请注意,在我的解决方案中,我希望“路径”(列表)导致一个字符串值。
  • 必须指定迭代索引i 不是很好,恕我直言。此外,我并没有真正得到停止标准,因为问题中没有任何内容让我假设该值是一个字符串。检查dict,如果不是就停下来不是更好吗?
  • @HannesOvrén 肯定会更好。我写了答案作为 OP 的提示。他可以随心所欲地对其进行微调。我一有空就会编辑。
【解决方案2】:

你可以用一个简单的for循环来做到这一点。

def get_nested_key(keypath, nested_dict):
    d = nested_dict
    for key in keypath:
        d = d[keypath]
    return d

>>> get_nested_key(('test', 'test1'), Dict)

根据需要添加错误检查。

【讨论】:

    【解决方案3】:

    你可以用一个简单的字典 reduce 来做到这一点:

    >>> mydict = {"test": {'test1': "value"}, "test3": "value"}
    >>> print reduce(dict.get, ['test', 'test1'], mydict)
    value
    

    【讨论】:

    • 我喜欢这个!唯一的问题似乎是,如果密钥不存在,您将得到None,而不是KeyError,我认为这是对该错误最明显的回应。您无法区分键的值为 None 和键不存在。
    • 同意。我不清楚这些边缘情况之间的期望行为是什么。可以将其更改为reduce(dict.__getitem__, ['test', 'test1'], mydict),然后在密钥不存在(例如['test', 'test2'])和尝试查找值(例如['test', 'test1', 'value'])时都会引发错误,尽管会出现不同的错误。也可以将其更改为 reduce(lambda x, y: x[y] if isinstance(x, dict) else None, ['test', 'test1'], mydict) 以在两种情况下都返回 None。
    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多