Python实现:查找学生-教授dictionary中教授列表交集最大的学生对
核心实现逻辑
- 数据预处理阶段:将每个学生对应的教授列表转换为集合,既消除列表内重复记录的教授对计数的干扰,同时大幅提升后续交集计算的执行效率
- 无重复配对遍历:用组合生成器生成所有不重复的学生两两配对,避免重复计算等价的学生对(如“甲和乙”与“乙和甲”为同一组配对,仅计算一次)
- 动态更新最优解:逐组计算配对的共同教授数量,记录当前最大交集规模和对应的学生对,全量遍历完成后直接输出结果
可直接使用的Python实现
函数入参为结构符合要求的
key:学生姓名, value:教授名单列表字典,可直接接入题目提及的字典数据源进行调用
import itertools def get_max_common_prof_pair(student_teacher_dict): # 预处理为集合结构,自动去重+加速交集计算 prof_set_map = { student: set(prof_list) for student, prof_list in student_teacher_dict.items() } max_common_num = 0 target_pair = None # 生成所有不重复的两两学生组合,避免重复运算 for stu_a, stu_b in itertools.combinations(prof_set_map.keys(), 2): common_num = len(prof_set_map[stu_a] & prof_set_map[stu_b]) if common_num > max_common_num: max_common_num = common_num target_pair = (stu_a, stu_b) # 性能优化:碰到理论上的最大可能交集值时,直接终止遍历 if max_common_num == min(len(prof_set_map[stu_a]), len(prof_set_map[stu_b])): break return target_pair, max_common_num # 调用示例 if __name__ == "__main__": # 替换为实际业务读取到的字典数据即可 demo_dict = { "小明": ["张教授", "刘教授", "陈教授"], "小红": ["张教授", "刘教授", "周教授"], "小刚": ["张教授", "周教授", "吴教授", "郑教授"] } pair, common_count = get_max_common_prof_pair(demo_dict) print(f"共同教授最多的学生对:{pair},共同教授数量:{common_count}")
实现说明
- 相比直接使用列表逐元素判断交集的方式,集合的交集运算在数据量较大时性能优势显著,同时自动规避了同一教授在列表内重复录入导致的计数偏差
- 代码逻辑完全满足“存在多组同规模交集的学生对时,任选一组输出”的要求,最终会保留遍历过程中遇到的第一组达到最大交集规模的配对
- 内置的提前终止判断可在碰到理论上最大可能交集值时直接停止后续遍历,减少不必要的计算开销
内容的提问来源于stack exchange,提问作者kxtof
相关产品推荐
相关产品推荐

