Python实现欧冠赛事随机模拟偶发索引错误排查求助
欧冠模拟程序错误排查与修复
错误根本原因
- 16强对阵生成逻辑循环次数错误:你设置了
for i in range(16)的循环,但16支球队两两配对仅需要生成8场对阵,循环16次会在所有球队都被抽取完毕后仍尝试从空列表中取元素,直接抛出索引错误。 - 同组规避逻辑存在死锁风险:当前抽取逻辑没有预判剩余球队的分组情况,如果最后剩下的2支球队刚好来自同一小组,程序会陷入无限循环查找可用对手,最终因所有可选列表为空报错。
- 变量命名不规范:使用Python内置关键字
list作为变量名,存在潜在的命名冲突风险。
修复后的完整代码
import random teams = ["Barcelona", "Atlético Madrid", "Real Madrid", "Valencia", "Manchester City", "Liverpool", "Chelsea", "Tottenham Hotspur", "Juventus", "Napoli", "Atalanta", "Internazionale Milano", "Bayern München", "Borussia Dortmund", "RB Leipzig", "Bayer Leverkusen", "Paris Saint-Germain", "LOSC Lille", "Lyon", "Zenit", "Lokomotiv Moskva", "Benfica", "Shakhtar Donetsk", "Genk", "Club Brugge", "Galatasaray", "Salzburg", "Slavia Praha", "Ajax", "Olympiacos", "GNK Dinamo", "Crvena zvezda"] random.shuffle(teams) # 打乱32支球队顺序 # 分组逻辑优化,避免重复判断 groups = [teams[i*4 : (i+1)*4] for i in range(8)] group_names = ["A", "B", "C", "D", "E", "F", "G", "H"] # 打印分组结果 for idx, name in enumerate(group_names): print(f"Group {name}:\n", groups[idx]) # 生成16强晋级名单,同时记录所属小组避免同组对阵 r16 = [] for group_idx, group in enumerate(groups): # 每个小组随机选2支晋级 qualified = random.sample(group, 2) for team in qualified: r16.append({"name": team, "group": group_idx}) print("\n\n晋级16强的球队:", [t["name"] for t in r16]) # 16强对阵生成逻辑重构 r16_matches = [] available = r16.copy() for _ in range(8): # 取出第一支可用球队 team1 = available.pop(0) # 筛选所有和team1不同组的可选球队 valid_opponents = [t for t in available if t["group"] != team1["group"]] # 随机选对手 team2 = random.choice(valid_opponents) available.remove(team2) # 保存对阵 r16_matches.append([team1["name"], team2["name"]]) print("\n\n16强对阵:", r16_matches, "\n\n") # 1/4决赛生成 Qfinals = [] # 先模拟16强赛的胜者 r16_winners = [random.choice(match) for match in r16_matches] # 随机打乱胜者后两两配对 random.shuffle(r16_winners) for i in range(0, 8, 2): Qfinals.append([r16_winners[i], r16_winners[i+1]]) for l in range(4): print("1/4决赛 ", l+1, " : ", Qfinals[l][0], " vs ", Qfinals[l][1]) # 半决赛生成 Sfinals = [random.choice(match) for match in Qfinals] random.shuffle(Sfinals) semi_matches = [[Sfinals[0], Sfinals[1]], [Sfinals[2], Sfinals[3]]] print("\n\n半决赛对阵:") for match in semi_matches: print(f"{match[0]} vs {match[1]}") # 决赛生成 finalists = [random.choice(match) for match in semi_matches] print("\n\n决赛:", f"{finalists[0]} vs {finalists[1]}") # 决出冠军 winner = random.choice(finalists) print("\n\n冠军:", winner)
关键修改说明
- 优化了分组生成逻辑,用列表推导式替代多分支判断,代码更简洁不易出错
- 16强球队增加了所属小组的标记,配对时先筛选合法对手,从根源避免同组对阵和死锁问题
- 16强循环次数调整为8次,匹配实际对阵数量,避免索引越界
- 后续淘汰赛阶段先随机打乱晋级球队再配对,符合真实赛事抽签逻辑,同时避免固定索引取值的潜在错误
- 移除了用
list作为变量名的不规范写法,消除命名冲突风险
内容的提问来源于stack exchange,提问作者Avyay Nair
相关产品推荐
相关产品推荐

