1

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

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

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

在我的示例中,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)
4

3 回答 3

3
def walk_to_value(d, l):
    for e in l:
        d = d[e]
    return d

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

于 2013-09-02T16:25:16.700 回答
3

使用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
于 2013-09-02T16:27:48.193 回答
0
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。

于 2013-09-02T16:28:42.433 回答