Python实现从22名球员中选11人并指定队长副队长方案求助
实现从22名球员中生成所有符合要求的11人队伍(含队长副队长)
需求明确
- 两支初始队伍各含11名球员,总计22人
- 生成所有可能的11人新队伍组合
- 对每个11人组合,生成所有队长+副队长的搭配(队长与副队长不能为同一人)
- 支持从Excel读取球员名单
完整实现代码
依赖准备
如果需要从Excel读取数据,先安装pandas:
pip install pandas
代码示例
import itertools import pandas as pd def read_players_from_excel(file_path): # 假设Excel文件中有一列名为"Player"存储球员姓名 df = pd.read_excel(file_path) return df["Player"].tolist() # 方式1:从Excel读取22名球员 # players = read_players_from_excel("players_list.xlsx") # 方式2:直接定义22名球员(示例数据) players = [ "Team1_Player1", "Team1_Player2", "Team1_Player3", "Team1_Player4", "Team1_Player5", "Team1_Player6", "Team1_Player7", "Team1_Player8", "Team1_Player9", "Team1_Player10", "Team1_Player11", "Team2_Player1", "Team2_Player2", "Team2_Player3", "Team2_Player4", "Team2_Player5", "Team2_Player6", "Team2_Player7", "Team2_Player8", "Team2_Player9", "Team2_Player10", "Team2_Player11" ] # 拆分初始两队(如果需要按初始队筛选人数) team1 = players[:11] team2 = players[11:] total_teams = 0 # 遍历所有可能的初始队人数分配(从Team1选0-11人,Team2对应选11-0人) for pick_from_team1 in range(0, 12): pick_from_team2 = 11 - pick_from_team1 # 生成所有Team1选pick_from_team1人的组合 for t1_members in itertools.combinations(team1, pick_from_team1): # 生成所有Team2选pick_from_team2人的组合 for t2_members in itertools.combinations(team2, pick_from_team2): total_teams += 1 current_team = list(t1_members) + list(t2_members) print(f"=== 第 {total_teams} 支队伍(Team1:{pick_from_team1}人 | Team2:{pick_from_team2}人)===") # 生成所有队长+副队长的搭配(顺序代表职位,队长在前,副队在后) for captain, vice_captain in itertools.permutations(current_team, 2): # 给队长和副队添加标记 marked_team = [] for player in current_team: if player == captain: marked_team.append(f"{player}(c)") elif player == vice_captain: marked_team.append(f"{player}(vc)") else: marked_team.append(player) # 输出队伍成员 for member in marked_team: print(member) print("---") # 分隔同一队伍的不同队长副队组合
代码说明
- Excel读取:通过
read_players_from_excel函数读取Excel中的球员名单,需确保Excel有Player列存储姓名,可根据实际修改列名。 - 生成所有队伍组合:
- 用
itertools.combinations生成不重复的球员组合,保证每支队伍的成员唯一。 - 按初始队人数拆分遍历,覆盖所有“Team1选k人+Team2选11-k人”的情况(k从0到11)。
- 用
- 队长副队分配:用
itertools.permutations(current_team, 2)生成所有可能的队长副队搭配,因为队长和副队是不同职位,顺序不同代表不同的任命结果。 - 标记输出:遍历队伍成员,给队长添加
(c)标记,副队添加(vc)标记,其余成员正常显示。
注意事项
- 22人选11人的组合数为
C(22,11)=705432,每支队伍又有11*10=110种队长副队搭配,总共有超过7700万种结果,直接输出所有结果会占用大量资源。如果不需要全量结果,可以:- 随机生成指定数量的队伍(用
random.sample替代itertools.combinations) - 添加筛选条件(比如限制初始两队的人数范围)
- 随机生成指定数量的队伍(用
内容的提问来源于stack exchange,提问作者user13975334
相关产品推荐
相关产品推荐

