You need to enable JavaScript to run this app. Python实现欧冠赛事随机模拟偶发索引错误排查求助
优惠活动
大模型
产品
解决方案
定价
更多

Python实现欧冠赛事随机模拟偶发索引错误排查求助

欧冠模拟程序错误排查与修复

错误根本原因

  1. 16强对阵生成逻辑循环次数错误:你设置了for i in range(16)的循环,但16支球队两两配对仅需要生成8场对阵,循环16次会在所有球队都被抽取完毕后仍尝试从空列表中取元素,直接抛出索引错误。
  2. 同组规避逻辑存在死锁风险:当前抽取逻辑没有预判剩余球队的分组情况,如果最后剩下的2支球队刚好来自同一小组,程序会陷入无限循环查找可用对手,最终因所有可选列表为空报错。
  3. 变量命名不规范:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 18:15:03