Python使用条件与运算符打印学生排课冲突方阵的实现咨询
答辩安排冲突矩阵生成实现方案
原代码核心问题
- 索引逻辑错误:D1、D2是单个学生的元组,不需要嵌套循环遍历长度,D1[1]直接对应导师ID,D1[2]直接对应答辩委员会成员元组
- 条件判断逻辑错误:未区分优先级,应优先判断「同时存在委员会冲突+导师冲突」的场景,再判断单一冲突场景,原代码未加括号明确逻辑运算范围,导致判断结果不符合预期
- 循环范围缺失:外层循环只遍历到下标8,漏掉了第10个学生(下标9对应S10)
- 缺少每行末尾的冲突统计逻辑
完整实现代码
数据定义
G = [('S1', 'A8', ('A1', 'A2', 'A3')), ('S2', 'A5', ('A1', 'A2', 'A3')), ('S3', 'A6', ('A3', 'A4', 'A5')), ('S4', 'A1', ('A6', 'A7', 'A8')), ('S5', 'A4', ('A6', 'A7', 'A8')), ('S6', 'A2', ('A9', 'A10', 'A11')), ('S7', 'A3', ('A8', 'A9', 'A10')), ('S8', 'A4', ('A12', 'A13', 'A10')), ('S9', 'A10', ('A12', 'A13', 'A14')), ('S10', 'A11', ('A12', 'A13', 'A7'))]
功能实现
def generate_conflict_matrix(G): n = len(G) # 矩阵多开1列存储每行冲突总数 matrix = [[0]*(n+1) for _ in range(n)] for i in range(n): _, tutor_i, committee_i = G[i] conflict_count = 0 for j in range(n): if i == j: matrix[i][j] = '-' # 自身无需判断冲突 continue _, tutor_j, committee_j = G[j] # 分别判断两种冲突类型 has_committee_conflict = len(set(committee_i) & set(committee_j)) > 0 has_tutor_conflict = (tutor_i in committee_j) or (tutor_j in committee_i) if has_committee_conflict and has_tutor_conflict: matrix[i][j] = '1*' conflict_count += 1 elif has_committee_conflict: matrix[i][j] = '1' conflict_count += 1 elif has_tutor_conflict: matrix[i][j] = '*' conflict_count += 1 else: matrix[i][j] = '0' # 写入该行冲突总数 matrix[i][-1] = conflict_count return matrix # 调用生成并格式化打印 conflict_matrix = generate_conflict_matrix(G) print("学生\t" + "\t".join([f"S{i+1}" for i in range(10)]) + "\t冲突总数") for idx, row in enumerate(conflict_matrix): print(f"S{idx+1}\t" + "\t".join(map(str, row)))
输出说明
运行代码后会输出符合规则的10行矩阵:
- 前10列为对应两个学生的冲突标记,完全匹配你给出的4类冲突规则
- 最后一列统计该行学生的总冲突数(所有非0标记的数量)
内容的提问来源于stack exchange,提问作者Sazee
相关产品推荐
相关产品推荐

