2013-10-01 39 views
2

提取特定路徑I具有矩陣:從多級詞典

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']

我不確定這樣做的最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) 
+1

我沒有看到你已經發布的內容有什麼問題。你可以創建一個封裝字典的類,並在內部完成,以便可以調用matrix [mystring],但不確定它是否需要。 –

回答

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

+0

這是一個很好的方法。 –

+0

謝謝。有時候我只需要第二組眼睛。 –

4

我喜歡原來的罰款。任何涉及reduce的回答都會讓絕大多數代碼讀者在絕望中瘋狂(LOL - 但是有一個原因,即在Python 3中內置了一個reduce不再有尊嚴)。我只是建議削減它的「羅嗦」:

def get_target_path(pth, mtx): 
    for level in pth: 
     mtx = mtx.get(level, None) 
     if mtx is None: 
      break 
    return mtx 
+2

在'dict.get'調用中不需要None作爲第二個參數。它的默認值爲None :) – TerryA

+1

Ya,但「顯式比隱式更好」;-) –