代码之家  ›  专栏  ›  技术社区  ›  Tessnim

分层字典的递归打印方法

  •  3
  • Tessnim  · 技术社区  · 6 年前

    partners = {
            'manager-1': {
                'name': 'Manager 1',
                'children': {
                    'manager-2': {
                        'name': 'Manager 2',
                        'children': {
                            'employee-1': {
                                'name': 'Employee 1',
                                'children': {
                                    'employee-7': {
                                        'name': 'Employee 7',
                                    },
                                    'employee-8': {
                                        'name': 'Employee 8',
                                    }
                                }
                            },
                            'employee-2': {
                                'name': 'Employee 2',
                            },
                            'employee-3': {
                                'name': 'Employee 3',
                            },
                        },
                    },
                    'manager-3': {
                        'name': 'Manager 3',
                        'children': {
                            'employee-4': {
                                'name': 'Employee 4',
                            },
                            'employee-5': {
                                'name': 'Employee 5',
                            },
                            'employee-6': {
                                'name': 'Employee 6',
                            },
                        },
                    },
                    'manager-4': {
                        'name': 'Manager 4',
                    },
                    'manager-5': {
                        'name': 'Manager 5',
                    }
                }
            }
        }
    

    给它这样:

    --Manager 1
    ----Manager 2
    ------Employee 1
    --------Employee 7
    --------Employee 8
    ------Employee 2
    ------Employee 3
    ----Manager 3
    ------Manager 4
    ------Manager 5
    ------Manager 6
    ----Manager 4
    ----Manager 5
    

    我做了这个方法:

    def hierarch(partners):
        for partner in partners:
            if 'children' not in partner.keys(): 
                print(partner['name'])
            else:
                hierarch(partner['children'])
    

    AttributeError: 'str' object has no attribute 'keys'
    

    如何生成允许打印此层次结构的脚本?我对字典不太在行。我正在使用python3。需要帮忙吗?谢谢。

    2 回复  |  直到 6 年前
        1
  •  5
  •   Florian Weimer    6 年前

    你需要复制准确的顺序吗?您可以使用这样的方法遍历数据结构:

    def recurse(data, level):
        if type(data) is dict:
            if "name" in data:
                print("-" * level + data["name"])
            for (key, value) in data.items():
                recurse(value, level + 1)
    recurse(partners, 1)
    
        2
  •  0
  •   PM 2Ring    6 年前

    AttributeError 因为你在递归调用 hierarch 作用于每个“子”值。这对于“employee-1”这样的键是有效的,因为递归调用将在关联的dict上循环,但是在“name”上它将失败,因为没有关联的dict,只有一个名称字符串。

    因此,您需要测试每个项,以查看在其上递归是否有效。你可以用 type 功能,但建议使用更通用的 isinstance 功能。

    与其打印所需的名称,我们还可以通过将函数转换为生成器使其更加灵活。这样我们就可以循环生成的结果,边打印边打印,或者执行其他一些处理。或者我们可以很容易地将它们收集到一个列表中,或者一个新的扁平字典中。

    partners = {
        'manager-1': {
            'name': 'Manager 1',
            'children': {
                'manager-2': {
                    'name': 'Manager 2',
                    'children': {
                        'employee-1': {
                            'name': 'Employee 1',
                            'children': {
                                'employee-7': {
                                    'name': 'Employee 7',
                                },
                                'employee-8': {
                                    'name': 'Employee 8',
                                }
                            }
                        },
                        'employee-2': {
                            'name': 'Employee 2',
                        },
                        'employee-3': {
                            'name': 'Employee 3',
                        },
                    },
                },
                'manager-3': {
                    'name': 'Manager 3',
                    'children': {
                        'employee-4': {
                            'name': 'Employee 4',
                        },
                        'employee-5': {
                            'name': 'Employee 5',
                        },
                        'employee-6': {
                            'name': 'Employee 6',
                        },
                    },
                },
                'manager-4': {
                    'name': 'Manager 4',
                },
                'manager-5': {
                    'name': 'Manager 5',
                }
            }
        }
    }
    
    def show(obj, depth=0):
        depth += 1
        for v in obj.values():
            if isinstance(v, dict):
                yield from show(v, depth)
            else:
                yield v, depth
    
    for v, depth in show(partners):
        print('-' * depth + v)   
    

    输出

    --Manager 1
    ----Manager 2
    ------Employee 1
    --------Employee 7
    --------Employee 8
    ------Employee 2
    ------Employee 3
    ----Manager 3
    ------Employee 4
    ------Employee 5
    ------Employee 6
    ----Manager 4
    ----Manager 5