如果我有字典
dict={'a':{'b':1}}
我用
dict['a']['b']
访问' 1'。但是,如果我的dict是一组未知数字的级联字典(即dict={'a':{'b':{'c':{'d':...}...{'?':1}}...})
,我如何循环通过dict来访问最终值?
我一直试图遍历dict,每次构建一个字符串以获取"['a']['b']['c']..."
并将此字符串与eval()
一起使用,但我无法弄清楚如何利用eval()
进行字典访问。
我想做类似伪代码的事情:
x="['a']['b']['c']"
eval(dict[x])
以获取
的值dict['a']['b']['c']
如果有人有任何其他想法,请分享。谢谢。
答案 0 :(得分:2)
怎么样:
def get(d, keys):
for key in keys:
d = d[key]
return d
d={'a':{'b':1}}
get(d, ['a', 'b'])
答案 1 :(得分:2)
简而言之:
>>> dct = {"a": {"b": {"c": 1}}}
>>> reduce(dict.get, ["a", "b", "c"], dct)
1
reduce
和dict.get
允许"键"喜欢[" a"," b"," c"] 拥有字典dct
:
>>> dct = {"a": {"b": {"c": 1}}}
我们可以通过get
:
>>> dct.get("a")
{'b': {'c': 1}}
>>> dct.get("a").get("b")
{'c': 1}
>>> dct.get("a").get("b").get("c")
1
reduce
可以在以前的结果上重复应用一种方法:
>>> reduce(dict.get, ["a", "b", "c"], dct)
1
如果上述一行方法似乎不适合您的需要,您可以创建访问功能:
>>> def getdeep(dct, deepkey):
... return reduce(dict.get, deepkey, dct)
...
测试deepkey
是否为键列表:
>>> getdeep(dct, ["a", "b"])
{'c': 1}
进入任何级别(假设值存在于那里)
>>> getdeep(dct, ["a", "b", "c"])
1
适用于任何可迭代的,包括可清除的元组:
>>> getdeep(dct, ("a", "b", "c"))
1
并且您可以开始使用表示值的深度地址的变量:
>>> deepkey = ("a", "b", "c")
>>> getdeep(dct, deepkey)
1
setdeep
使用reduce
如果我们想使用reduce
来修改deepkey
指向的值,我们可以这样做,但分两步:
1
,而是{"c": 1}
在控制台上看起来像:
>>> reduce(dict.get, deepkey[:-1], dct)
{"c": 1}
>>> reduce(dict.get, deepkey[:-1], dct)[deepkey[-1]] = 99
>>> dct
{"a": {"b": {"c": 99}}}
所以setdeep
可以写成:
def setdeep(dct, deepkey, val):
getdeep(dct, deepkey[:-1])[deepkey[-1]] = val