层次词典的递归打印方法

2024-05-15 23:26:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Python创建一个递归方法来打印这个字典:

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',
                }
            }
        }
    }

给出如下:

^{pr2}$

我做了这个方法:

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。有什么帮助吗?谢谢。在


Tags: 方法nameinpartner字典defemployeemanager
2条回答

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

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)

您得到了AttributeError,因为您递归地对每个'children'值调用hierarch函数。这对'employee-1'这样的键有效,因为递归调用将在关联的dict上循环,但是在'name'上会失败,因为没有关联的dict,只有一个名称字符串。在

因此,您需要测试每个项,以确定它是否有效地在其上递归。您可以使用type函数来实现这一点,但建议您使用更通用的^{}函数。在

我们不需要打印所需的名称,而是可以通过将函数转换为生成器使其更加灵活。这样我们就可以循环生成的结果,边打印边执行其他处理。或者我们可以很容易地把它们收集成一个列表,或者一个新的平面词典。在

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)   

输出

^{pr2}$

相关问题 更多 >