2

我有一个矩阵:

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']or matrix['A']['A2']

简单来说,我有一个多级字典,以及一个映射到该字典中层次结构的字符串列表。如['A','A1','A2']

我不确定这样做的最pythonic方式。

以下作品。我只是想知道是否有更简洁或可读的方式。我希望另一双眼睛能够提供意见并纠正一个明显的错误。

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 )
4

2 回答 2

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)。

于 2013-10-01T23:38:59.753 回答
4

我喜欢原来的罚款。任何涉及的答案reduce都会让大多数代码阅读者绝望地摸不着头脑(哈哈——但有一个原因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
于 2013-10-01T23:49:53.473 回答