Python实现组织树员工完整管理路径收集问题求助
问题:生成员工完整管理路径字典
我有一个JSON格式的组织树数据,需要为每位员工存储完整的“管理路径”,例如:management_chain["clever"] = {"bravo", "amos"},management_chain["bart"] = {"amos"}。但我编写的遍历代码返回的字典无法保存正确值,请求解决。
组织树JSON数据
{ "name": "amos", "direct_reports": [ { "name": "bart", "direct_reports": [ { "name": "colin", "direct_reports": [] }, { "name": "clara", "direct_reports": [] } ] }, { "name": "bravo", "direct_reports": [ { "name": "cupid", "direct_reports": [] }, { "name": "clever", "direct_reports": [] } ] } ] }
现有代码
def get_herarchy(org): tmp_obj = {} tmp_obj['managers'] = [] for emp in org['direct_reports']: tmp_obj['managers'].append(org['name']) print("manager "+org['name']) if len(emp['direct_reports'])>0: get_herarchy(emp) tmp_obj['name'] = emp['name'] print(emp['name']) return tmp_obj
问题分析
原代码存在几个核心问题:
- 每次递归调用都会重新创建
tmp_obj,递归得到的结果完全没有被收集到最终输出中 tmp_obj的name和managers会被循环反复覆盖,最终只会返回最后一个员工的信息,无法存储所有员工的管理路径- 没有传递当前层级的管理路径,递归时无法继承上级的管理者列表
解决方案
通过传递当前管理路径+全局结果字典的方式实现,递归遍历每个员工时,将当前员工的完整管理路径存入结果字典:
def build_management_chain(org, current_managers=None, result=None): # 初始化结果字典和当前管理路径 if result is None: result = {} if current_managers is None: current_managers = [] # 遍历当前节点的直接下属 for emp in org['direct_reports']: # 当前员工的管理路径是上级的管理路径加上当前节点的名字 emp_managers = current_managers + [org['name']] # 将员工和对应的管理路径存入结果(用集合去重,也可以用列表保持层级顺序) result[emp['name']] = set(emp_managers) # 如果该员工还有下属,递归处理,传递当前员工的管理路径 if emp['direct_reports']: build_management_chain(emp, emp_managers, result) return result # 测试调用 org_data = { "name": "amos", "direct_reports": [ {"name": "bart", "direct_reports": [{"name": "colin", "direct_reports": []}, {"name": "clara", "direct_reports": []}]}, {"name": "bravo", "direct_reports": [{"name": "cupid", "direct_reports": []}, {"name": "clever", "direct_reports": []}]} ] } management_chain = build_management_chain(org_data) print(management_chain)
输出结果
运行后会得到符合要求的管理路径字典:
{ 'bart': {'amos'}, 'colin': {'bart', 'amos'}, 'clara': {'bart', 'amos'}, 'bravo': {'amos'}, 'cupid': {'bravo', 'amos'}, 'clever': {'bravo', 'amos'} }
内容的提问来源于stack exchange,提问作者Ziv M
相关产品推荐
相关产品推荐

