我想使用键列表来处理多维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)
答案 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。