Python 递归方法打印分层字典
我想用Python创建一个递归方法来打印这个字典:Python 递归方法打印分层字典,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我想用Python创建一个递归方法来打印这个字典: partners = { 'manager-1': { 'name': 'Manager 1', 'children': { 'manager-2': { 'name': 'Manager 2', 'children': {
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'
如何制作允许打印此层次结构的脚本?我对字典不太在行。我正在使用Python 3。需要帮忙吗?谢谢。您需要复制准确的顺序吗?您可以使用类似这样的方法遍历数据结构:
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,只有一个名称字符串
因此,您需要测试每个项,以查看在其上递归是否有效。您可以使用类型
功能,但建议使用更通用的功能
与其打印所需的名称,我们还可以通过将函数转换为生成器使其更加灵活。这样我们就可以循环生成的结果,边打印边打印,或者执行其他一些处理。或者我们可以很容易地将它们收集到一个列表或一个新的平面字典中
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
你试过什么吗?因此,这并不是让人们为您编写代码。另外,为什么预期的输出没有
Employee 7
?一种更简洁的方法是将level作为默认参数,这样在最初调用函数时就不必显式地声明<代码>定义递归(数据,级别=1)。此外,OP的输出每级有+2个破折号,因此可能会增加2并从2开始。