我有一个矩阵:
matrix = {
'A' : {
'A1' : {
'A11' : [1,2,3],
'A12' : [4,5,6],
},
'A2' : {
'A21' : [11,12,14],
'A22' : [14,15,16],
},
'A3' : {
'A31' : [111,112,114],
'A32' : [114,115,116],
},
}
}
我希望检索动态查询的特定路径 - 例如matrix['A']['A2']['A22']
或matrix['A']['A2']
。
简单来说,我有一个多级字典,以及映射到该字典中层次结构的字符串列表。例如['A','A1','A2']
我不确定这种做法最为诡辩。
以下作品。我只是想知道是否有更简洁或可读的方式。我喜欢另一双眼睛提供输入并纠正一个明显的错误。
get_target_path( pth , mtx ):
try:
value = mtx
for level in pth :
value = value[level]
return value
except KeyError :
return None
target_path = ['A','A2','A22']
result = get_target_path( target_path , matrix )
答案 0 :(得分:7)
较短的选项是:
import operator
from functools import reduce # in python 3 only; reduce is a builtin in python 2
def get_target_path(path, matrix):
try:
return reduce(operator.getitem, path, matrix)
except KeyError:
return None
但我认为它没有任何好转;我可能会按你的方式写它(虽然间距不同:p)。
答案 1 :(得分:4)
我喜欢原来的罚款。任何涉及reduce
的答案都会让大多数代码读者在绝望中摸不着头脑(LOL - 但有一个原因reduce
不再因为内置于Python 3而变得有尊严。我只是建议削减它的“冗长”:
def get_target_path(pth, mtx):
for level in pth:
mtx = mtx.get(level, None)
if mtx is None:
break
return mtx