如何用Itertools实现双循环赛制对阵并分配唯一比赛编号?
解决双循环赛制对阵生成与唯一编号问题
核心问题分析
combinations生成的是无序二元组,所以(意大利, 英格兰)和(英格兰, 意大利)会被视为同一组,无法满足双循环赛制中主客场各赛一场的要求。要解决这个问题,需要生成有序二元组,同时给每场比赛分配唯一编号。
方法一:使用permutations生成有序对阵
itertools.permutations会生成所有长度为指定值的有序排列,正好对应主客场的不同对阵。搭配enumerate可以直接生成唯一编号:
from itertools import permutations teams = ["意大利", "英格兰", "法国", "德国"] # 生成所有主客场对阵,编号从1开始 all_matchups = [ (home_team, away_team, match_id) for match_id, (home_team, away_team) in enumerate(permutations(teams, 2), start=1) ] print(all_matchups)
说明:
permutations(teams, 2)会生成所有不同的有序二元组,比如("意大利", "英格兰")和("英格兰", "意大利")都会被生成enumerate(..., start=1)自动为每场比赛分配从1开始的连续唯一编号
方法二:手动扩展combinations结果
如果你不想用permutations,可以对combinations生成的每一组无序对阵,手动生成主客场两个方向的比赛,并维护一个计数器来分配编号:
from itertools import combinations teams = ["意大利", "英格兰", "法国", "德国"] all_matchups = [] current_id = 1 for team1, team2 in combinations(teams, 2): # 添加主客场第一场 all_matchups.append((team1, team2, current_id)) current_id += 1 # 添加主客场第二场 all_matchups.append((team2, team1, current_id)) current_id += 1 print(all_matchups)
说明:
- 这种方式更直观,手动控制每一场比赛的生成逻辑
- 通过
current_id计数器确保编号唯一且连续
内容的提问来源于stack exchange,提问作者ish
相关产品推荐
相关产品推荐

