簡體   English   中英

如何從字典中返回所有路徑?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM