使用键列表行走多维dict的优雅方式?

时间:2013-09-02 16:24:04

标签: python list recursion dictionary multidimensional-array

我想使用键列表来处理多维dict。在最后一个键,我将返回值。

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

这就是我想出的。有更优雅的方式吗?

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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

答案 2 :(得分: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)

有了这个,只要打电话给'三',你就会找到它。如果三个在当前(顶部第一个),它将返回它而不在树中进一步检查。如果不是,它将收集该级别的所有dicts并再试一次。当找到钥匙时,它只会返回它;否则函数返回False。