繁体   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