一个衬垫从字典python中查找嵌套值

Bah*_*rom 4 python reduce dictionary functools

假设我有一个任意嵌套的字典:

d = {
    11: {
        21: {31: 'a', 32: 'b'},
        22: {31: 'a', 34: 'c'},
    },
    12: {
        1: {2: 3}
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个键列表,其位置告诉我哪个嵌套字典可以查找每个键:

keys = [11, 21, 31]
# keys = [11, 23, 44]
Run Code Online (Sandbox Code Playgroud)

有一个简单的衬垫来做这个吗?我看了下面列出的问题,它们是相似的,但不是我真正想要的.我自己也试过了,想出了这个:

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'
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,如果是第二个键列表(参见注释掉的键),它会继续查找嵌套键,即使没有找到更高级别的键,继续也没有意义.我怎么能reduce在找到最终匹配或失败后立即停止(下面列出的一个问题解决了它,但我不能在我的用例中真正应用它......或者我可以吗?)?还有其他想法吗?哦,我想用官方的python库来完成这个.所以不numpy,pandas等等,但是functools,itertools没关系

Python:将列表转换为带有异常处理的多维dict的dict键

是否有一个简单的单行程序用于访问Python中嵌套的dictioanry的每个元素?

在Python 3.3中访问嵌套字典中的嵌套值

使用itertools进行递归函数应用

在中途停止Reduce()操作.做部分运行总和的功能方式

在字典中递归地查找密钥

谢谢!

zon*_*ndo 7

你可以使用functools.reduce():

from functools import reduce # In Python 2, don't import it. (It's a built-in)

print(reduce(dict.get, keys, d))

# 'a'
Run Code Online (Sandbox Code Playgroud)

对于你提到的键,它是这样的:

  • 调用dict.getd(初始)和第一项keys(11)来获得d[11]
  • 调用dict.get结果(字典)和keys(21)中的下一项来获取{...}[21]
  • 打电话dict.get...
    ...

直到keys"减少"到最终值('a')

编辑:作为dict.get结果None,如果不存在这样的键,有可能是不想要的结果.如果你想拥有KeyError,你可以使用operator.getitem.

  • `print(reduce(dict.get,keys,d))` (3认同)