假设我有一个任意嵌套的字典:
有没有一个简单的一行代码来实现这个?我看了下面列出的问题,它们是类似的,但不是我要找的。我也尝试过自己做,得到了这个:
这样做的问题在于,对于第二组键(请参见被注释的键),它会继续查找嵌套键,即使找不到更高级别的键也会继续查找,这样继续是毫无意义的。 我怎样才能在找到最终匹配或失败时立即停止
d = {
11: {
21: {31: 'a', 32: 'b'},
22: {31: 'a', 34: 'c'},
},
12: {
1: {2: 3}
}
}
还有一个键列表,其位置告诉我在哪个嵌套字典中查找每个键:
keys = [11, 21, 31]
# keys = [11, 23, 44]
有没有一个简单的一行代码来实现这个?我看了下面列出的问题,它们是类似的,但不是我要找的。我也尝试过自己做,得到了这个:
from functools import reduce
def lookup(d, key):
return d.get(key, {}) if d and isinstance(d, dict) else None
def fn(keys, d):
return reduce(lookup, keys, d)
print(fn(keys, d)) # prints 'a'
这样做的问题在于,对于第二组键(请参见被注释的键),它会继续查找嵌套键,即使找不到更高级别的键也会继续查找,这样继续是毫无意义的。 我怎样才能在找到最终匹配或失败时立即停止
reduce
(下面列出的问题之一解决了这个问题,但我实际使用时无法应用...还是可以吗?)? 有其他想法吗?哦,我想仅使用官方Python库来完成此操作。因此没有numpy
,pandas
等,但functools
,itertools
可以使用。
{{link2:在Python中访问嵌套字典的每个元素是否有简单的一行代码?}}
谢谢!
d[keys[0]][keys[1]][keys[2]]
如果存在最终匹配项,则会找到它,否则将失败。 - lc123dict.__getitem__
用作reduce
函数,当类型错误或未找到键时,它将引发异常。我认为这符合您提前停止的需求。只需在reduce
周围加上try
块即可。 - aghast