实现Python函数:迭代获取作业全层级依赖列表需求问询
作业依赖全层级遍历实现
问题背景
有一个竖线分隔的文本文件,包含job和dependent jobs两列,数据示例如下:
jobA|job1,job2,job3 jobB|job4,job5 job1|jobX,jobY job2|Null job3|Null job4|jobP,jobQ job5|Null jobP|jobR jobQ|Null jobR|Null jobX|Null jobY|jobZ jobZ|Null
数据规则
- 每行第一个字段为作业名称,第二个字段是该作业的前置依赖作业,多依赖用逗号分隔
Null表示该作业无前置依赖- 所有作业均已收录在文件中
需求
编写Python函数,接收作业名称列表作为输入,迭代获取所有层级的前置依赖作业,返回去重后的依赖列表(不含输入的作业本身)。
输入输出示例
- 输入:
['jobA']→ 返回:['job1','job2','job3','jobX','jobY','jobZ'] - 输入:
['jobB']→ 返回:['job4','job5','jobP','jobQ','jobR'] - 输入:
['jobA','jobB']→ 返回:['job1','job2','job3','jobX','jobY','jobZ','job4','job5','jobP','jobQ','jobR']
解决方案
代码实现
def load_job_dependencies(file_path): """从竖线分隔文件加载作业依赖映射""" dep_map = {} with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue job, deps = line.split('|', 1) if deps.strip() == 'Null': dep_map[job] = [] else: dep_map[job] = [d.strip() for d in deps.split(',')] return dep_map def get_all_dependencies(target_jobs, dep_map): """获取目标作业的所有层级前置依赖,返回去重后的有序列表""" visited = set() result = [] queue = target_jobs.copy() while queue: current_job = queue.pop(0) for dep in dep_map.get(current_job, []): if dep not in visited: visited.add(dep) result.append(dep) queue.append(dep) return result # 测试用例 if __name__ == '__main__': dep_map = load_job_dependencies('jobs.txt') print(get_all_dependencies(['jobA'], dep_map)) print(get_all_dependencies(['jobB'], dep_map)) print(get_all_dependencies(['jobA', 'jobB'], dep_map))
代码说明
- 依赖映射加载:
load_job_dependencies函数读取文件并解析为字典,键是作业名,值是该作业的前置依赖列表,自动处理Null为无依赖。 - 广度优先遍历:
get_all_dependencies用队列实现BFS,确保按层级顺序获取依赖(先直接依赖,再递归获取依赖的依赖);通过visited集合避免重复添加同一依赖,保证结果唯一。 - 输出顺序:结果列表的顺序与层级遍历顺序一致,符合示例要求。
内容的提问来源于stack exchange,提问作者Sidd
相关产品推荐
相关产品推荐

