【问题标题】:An elegant way of walking a multidimensional dict with a list of keys?一种使用键列表遍历多维字典的优雅方式?
【发布时间】:2013-09-05 19:22:29
【问题描述】:

我想使用键列表遍历多维字典。最后一个键,我会返回值。

我会得到一个列表,它会映射到字典的键,但我不知道我需要走多远。换句话说,我不会事先知道键列表中有多少项。

这就是我想出的。有没有更优雅的方式来做到这一点?

在我的示例中,walk_to_value() 将返回“三个值”:

d = {'one': {'two': {'three': 'the three value'}}}
l = ['one','two','three']

def walk_to_value(d, l):
    e = l.pop(0)
    d1 = d[e]
    if (type(d1) == dict):
            return walk_to_value(d1, l)
    else:
            return d1

print walk_to_value(d, l)

【问题讨论】:

  • 不要使用type,而是使用if isinstance(d1, dict):。这更加健壮,因为它还将包含从 dict 继承的对象。

标签: python list recursion dictionary multidimensional-array


【解决方案1】:
def walk_to_value(d, l):
    for e in l:
        d = d[e]
    return d

如果列表中的键比字典中的级别多,我认为提前返回没有用,但这取决于你。

【讨论】:

  • @blakev:不需要递归——在像 Python 这样的语言中,实现通常限制递归深度,避​​免它通常是个好主意。我不确定您所说的不走树是什么意思:每次迭代时,它都会采用适当的分支。
【解决方案2】:

使用reduce():

from operator import getitem

def walk_to_value(d, l):
     return reduce(getitem, l, d)

或者一个简单的循环:

def walk_to_value(d, l):
    result = d
    for field in l:
        result = result[field]
    return result

【讨论】:

    【解决方案3】:
    def traverse_tree(x, looking):
        def f(dic):
            if looking not in dic.keys():
                return reduce(lambda x, y: f(dict(y)) or x, filter(lambda y: isinstance(y, dict), dic.values()), False)
            return dic[looking]
        return f(x)
    

    有了这个,只需调用“三”作为您的查找,它就会为您找到它。如果三个在当前(顶部优先)中,它将返回它而不在树中进一步检查。如果不是,它将收集该级别中的所有字典并重试。找到密钥后,它会简单地返回它;否则函数返回 False。

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      相关资源
      最近更新 更多