![](/img/trans.png)
[英]Return all possible paths, having built a predecessor dictionary in Python
[英]How to return all paths from a dictionary?
可以說我有這本詞典
obj = {'layerA1':'string','layerA2':{'layerB1':{'layerC1':{},'layerC2':{}},
'layerB2':{}}}
我需要回來
['layerA2','layberB1','layerC1']
['layerA2','layerB1','layerC2']
['layerA2','layerB2']
無論字典有多深,它都應該起作用。 目前正在嘗試使用一些遞歸函數,但我似乎無法正確處理。 我目前擁有的是這樣的:
obj = {'layerA1':'string','layerA2':{'layerB1':{'layerC1':{},'layerC2':{}},
'layerB2':{}}}
hierarchy_list = []
def find_hierachy(param):
some_list = []
for key, value in param.items():
if type(param[key]) is dict:
some_list.append(key)
hierarchy_list.append(some_list)
find_hierachy(param[key])
find_hierachy(obj)
print(hierarchy_list)
[['layerA2'], ['layerB1', 'layerB2'], ['layerC1', 'layerC2'], ['layerC1', 'layerC2'], ['layerB1', 'layerB2']]
我不知道如何讓它返回由鍵組成的每個分層路徑
正如您在代碼中注意到的那樣,您需要跟蹤到目前為止所采用的路徑,這通常稱為前綴。 通過存儲前綴並傳遞它,我們可以跟蹤以前的鍵。 要記住的重要一點是,python 中的默認變量應該是不可變的(元組),除非您知道在使用遞歸時可變對象會發生什么。
answer = []
def hierarchy(dictionary, prefix=()):
for key, value in dictionary.items():
if isinstance(value, dict) and value:
hierarchy(value, (*prefix, key))
else:
answer.append((*prefix, key))
如果您希望最終答案是一個列表,您可以遍歷answers
並將它們轉換為一個列表,或者將列表作為前綴發送。 這需要我們將列表復制到層次結構的下一級。 這是使用[*prefix, key]
完成的,它會生成列表的新副本。
obj = {'layerA1': 'string', 'layerA2': {'layerB1': {'layerC1': {}, 'layerC2': {}},
'layerB2': {}}}
if __name__ == '__main__':
answer = []
def hierarchy(dictionary, prefix=None):
prefix = prefix if prefix is not None else []
for key, value in dictionary.items():
if isinstance(value, dict) and value:
hierarchy(value, [*prefix, key])
else:
answer.append([*prefix, key])
hierarchy(obj)
print(answer)
輸出
[['layerA1'], ['layerA2', 'layerB1', 'layerC1'], ['layerA2', 'layerB1', 'layerC2'], ['layerA2', 'layerB2']]
筆記:
類型檢查可以使用isinstance(obj, type)
來完成,這是type(obj) is type
上面的首選方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.