You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现ABC英超联赛赛程生成器:规则适配开发求助

问题解决:ABC英超联赛赛程生成程序

需求回顾

ABC英超联赛共10支球队,赛程需满足:

  • 每队与其他球队进行主客场双回合对决;同市球队必须完成所有跨市对决后再交手。
  • 每个周末仅4支球队参赛(2场对决)。
  • 每场对决需标注:双方所属城市、主场体育场、回合(Leg 1/Leg 2)、周次(weekend #X)。

现有代码的问题

  1. 循环次数不足:原代码仅循环len(teams)-1次,远不足以覆盖所有主客场对决。
  2. 同市对决提前生成:违反“先完成所有跨市对决再进行同市对决”的规则。
  3. 未跟踪已生成的对决:会重复生成相同对决,且未覆盖所有主客场场次。
  4. 输出信息不全:缺少球队所属城市的标注。
  5. 每周场次逻辑错误:无法保证每周稳定生成2场对决,球队参赛重复问题未妥善处理。

修正后的代码

import itertools
from collections import defaultdict

def generate_fixtures(teams):
    fixtures = []
    week_num = 1
    # 按城市分组,方便后续处理同市球队
    teams_by_town = defaultdict(list)
    for team in teams:
        teams_by_town[team[1]].append(team)
    
    # --------------------------
    # 第一阶段:生成所有跨市主客场对决
    # --------------------------
    cross_town_fixtures = []
    # 生成所有跨市组合(不重复的配对)
    for team_a, team_b in itertools.combinations(teams, 2):
        if team_a[1] != team_b[1]:
            # Leg 1: team_a 主场
            cross_town_fixtures.append({
                'home': team_a,
                'away': team_b,
                'leg': 'Leg 1'
            })
            # Leg 2: team_b 主场
            cross_town_fixtures.append({
                'home': team_b,
                'away': team_a,
                'leg': 'Leg 2'
            })
    
    # 按周安排跨市对决,每周2场,确保球队不重复参赛
    while cross_town_fixtures:
        week_schedule = []
        used_teams = set()
        # 挑选第一场对决
        for idx, fixture in enumerate(cross_town_fixtures):
            home_name = fixture['home'][0]
            away_name = fixture['away'][0]
            if home_name not in used_teams and away_name not in used_teams:
                week_schedule.append(fixture)
                used_teams.add(home_name)
                used_teams.add(away_name)
                del cross_town_fixtures[idx]
                break
        # 挑选第二场对决
        for idx, fixture in enumerate(cross_town_fixtures):
            home_name = fixture['home'][0]
            away_name = fixture['away'][0]
            if home_name not in used_teams and away_name not in used_teams:
                week_schedule.append(fixture)
                used_teams.add(home_name)
                used_teams.add(away_name)
                del cross_town_fixtures[idx]
                break
        # 格式化本周赛程并加入总列表
        for fx in week_schedule:
            home_team, home_town, home_stadium = fx['home']
            away_team, away_town, _ = fx['away']
            fixture_str = f"weekend #{week_num}: {home_team}({home_town}) vs {away_team}({away_town}) | {fx['leg']} | 主场: {home_stadium}"
            fixtures.append(fixture_str)
        week_num += 1
    
    # --------------------------
    # 第二阶段:生成所有同市主客场对决
    # --------------------------
    same_town_fixtures = []
    for town in teams_by_town:
        town_teams = teams_by_town[town]
        # 生成同市球队的主客场配对
        for team_a, team_b in itertools.combinations(town_teams, 2):
            # Leg 1: team_a 主场
            same_town_fixtures.append({
                'home': team_a,
                'away': team_b,
                'leg': 'Leg 1'
            })
            # Leg 2: team_b 主场
            same_town_fixtures.append({
                'home': team_b,
                'away': team_a,
                'leg': 'Leg 2'
            })
    
    # 按周安排同市对决,每周2场
    while same_town_fixtures:
        week_schedule = []
        used_teams = set()
        # 第一场
        for idx, fixture in enumerate(same_town_fixtures):
            home_name = fixture['home'][0]
            away_name = fixture['away'][0]
            if home_name not in used_teams and away_name not in used_teams:
                week_schedule.append(fixture)
                used_teams.add(home_name)
                used_teams.add(away_name)
                del same_town_fixtures[idx]
                break
        # 第二场
        if same_town_fixtures:
            for idx, fixture in enumerate(same_town_fixtures):
                home_name = fixture['home'][0]
                away_name = fixture['away'][0]
                if home_name not in used_teams and away_name not in used_teams:
                    week_schedule.append(fixture)
                    used_teams.add(home_name)
                    used_teams.add(away_name)
                    del same_town_fixtures[idx]
                    break
        # 格式化本周赛程
        for fx in week_schedule:
            home_team, home_town, home_stadium = fx['home']
            away_team, _, _ = fx['away']
            fixture_str = f"weekend #{week_num}: {home_team}({home_town}) vs {away_team}({home_town}) | {fx['leg']} | 主场: {home_stadium}"
            fixtures.append(fixture_str)
        week_num += 1
    
    return fixtures

# 定义球队信息
teams = [
    ("Team 1", "Town 1", "Stadium St1"),
    ("Team 2", "Town 1", "Stadium St2"),
    ("Team 3", "Town 2", "Stadium St3"),
    ("Team 4", "Town 2", "Stadium St4"),
    ("Team 5", "Town 3", "Stadium St5"),
    ("Team 6", "Town 3", "Stadium St6"),
    ("Team 7", "Town 4", "Stadium St7"),
    ("Team 8", "Town 4", "Stadium St8"),
    ("Team 9", "Town 5", "Stadium St9"),
    ("Team 10", "Town 5", "Stadium St10"),
]

# 生成并打印赛程
fixtures = generate_fixtures(teams)
for fixture in fixtures:
    print(fixture)

代码说明

  1. 阶段拆分:严格分为跨市对决阶段和同市对决阶段,完全符合规则要求。
  2. 主客场处理:对每对球队生成两次对决(Leg1主场、Leg2客场),确保双回合要求。
  3. 周赛程安排:每周挑选2场无重复参赛球队的对决,保证每周仅4支球队参赛。
  4. 信息完整性:输出中包含球队所属城市、主场体育场、回合及周次,满足展示需求。

内容的提问来源于stack exchange,提问作者Issa Osman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:09:53