如何实现循环赛模拟并生成排名表?支持自定义队伍数方案咨询
循环赛排名表实现方案与代码优化
一、核心问题解决思路
- 用字典存储每支队伍的统计数据(队名、总进球GF、总失球GA、积分PTS),替代零散变量,方便数据关联与后续排序。
- 每场比赛结束后直接计算两队积分:
- 若A队进球>B队:A加3分
- 若A队进球=B队:两队各加1分
- 若A队进球<B队:B加3分
- 排序规则:优先按积分降序,积分相同则按净胜球(GF-GA)降序,再按总进球降序(符合常规赛事排名逻辑)
二、支持任意队伍数的实现
使用itertools.combinations生成所有两两对阵的组合,自动构建循环赛赛程,无需硬编码每一场比赛。
三、完整优化代码
import random from itertools import combinations def main(): # 获取任意数量的队伍 num_teams = int(input("请输入队伍数量: ")) teams = [] for i in range(num_teams): team_name = input(f"请输入第{i+1}支队伍的名称: ") teams.append(team_name) # 初始化每支队伍的统计数据 team_stats = {team: {"GF": 0, "GA": 0, "PTS": 0} for team in teams} print("\n=== 赛事结果 ===") # 生成所有两两对阵的比赛 for team_a, team_b in combinations(teams, 2): score_a = random.randint(0, 5) score_b = random.randint(0, 5) print(f"{team_a} vs {team_b} {score_a}:{score_b}") # 更新进球和失球数据 team_stats[team_a]["GF"] += score_a team_stats[team_a]["GA"] += score_b team_stats[team_b]["GF"] += score_b team_stats[team_b]["GA"] += score_a # 计算积分 if score_a > score_b: team_stats[team_a]["PTS"] += 3 elif score_a == score_b: team_stats[team_a]["PTS"] += 1 team_stats[team_b]["PTS"] += 1 else: team_stats[team_b]["PTS"] += 3 # 按规则排序队伍 sorted_teams = sorted( team_stats.items(), key=lambda x: (-x[1]["PTS"], -(x[1]["GF"] - x[1]["GA"]), -x[1]["GF"]) ) # 打印最终排名表 print("\n=== 最终排名表 ===") print(f"{'Pos':<5} {'队名':<20} {'GF':<3} {'GA':<3} {'PTS':<3}") for idx, (team, stats) in enumerate(sorted_teams, 1): print(f"{idx:<5} {team:<20} {stats['GF']:<3} {stats['GA']:<3} {stats['PTS']:<3}") if __name__ == "__main__": main()
代码说明
itertools.combinations(teams, 2):生成所有不重复的两队组合,完美实现循环赛赛程。- 排序key中的
-表示降序排列,确保积分高、净胜球多、进球多的队伍排在前面。 - 字典
team_stats统一管理所有队伍数据,避免了原代码中变量分散的问题。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

