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的每个元素?
谢谢!
你可以使用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.get与d(初始)和第一项keys(11)来获得d[11]dict.get结果(字典)和keys(21)中的下一项来获取{...}[21]dict.get... 直到keys"减少"到最终值('a')
编辑:作为dict.get结果None,如果不存在这样的键,有可能是不想要的结果.如果你想拥有KeyError,你可以使用operator.getitem.
| 归档时间: |
|
| 查看次数: |
964 次 |
| 最近记录: |