【问题标题】:python: getting sub-dicts in dicts dynamically?python:动态获取字典中的子字典?
【发布时间】:2015-03-18 08:13:29
【问题描述】:

假设我想编写一个函数,该函数将从字典中返回任意值,例如:mydict['foo']['bar']['baz'],如果没有,则返回空字符串。但是,我不知道mydict['foo']是否一定存在,更不用说mydict['foo']['bar']['baz']了。

我想做这样的事情:

safe_nested(dict, element):
  try:
    return dict[element]
  except KeyError:
    return ''

但我不知道如何编写将接受函数中的查找路径的代码。我开始接受一个以句点分隔的字符串(如foo.bar.baz),所以这个函数可以递归地尝试获取下一个子字典,但这感觉不是很Pythonic。我想知道是否有办法同时传递字典(mydict)和我感兴趣的子结构(['foo']['bar']['baz']),并让函数尝试访问它或返回一个空字符串,如果它遇到KeyError

我这样做的方式是否正确?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    你应该使用标准的defaultdict:https://docs.python.org/2/library/collections.html#collections.defaultdict

    如何嵌套它们,请参阅:defaultdict of defaultdict, nestedMultiple levels of 'collection.defaultdict' in Python

    我认为这是你想要的:

    from collections import defaultdict
    mydict = defaultdict(lambda: defaultdict(lambda: defaultdict(str)))
    

    【讨论】:

    • 我相信 defaultdict 不是解决 OP 问题的方法。他已经有一个嵌套的dict 结构。
    • @thefourtheye:我已经用针对 OP 问题的特定工作代码更新了我的答案。
    • 我猜这对 OP 没有帮助。我认为他有一本字典,其中的键将字典作为值,而这些字典的键将值作为字典等等。现在,如果键的层次结构存在,他想从字典中的键序列中获取实际值,否则为空字符串。
    【解决方案2】:

    您可能还想查看addict

    >>> from addict import Dict
    >>> addicted = Dict()
    >>> addicted.a = 2
    >>> addicted.b.c.d.e
    {}
    >>> addicted
    {'a': 2, 'b': {'c': {'d': {'e': {}}}}}
    

    它返回一个空字典,而不是一个空字符串,但除此之外,它看起来就像你在问题中要求的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      相关资源
      最近更新 更多