如何用Python生成所有等级均衡的5组队伍组合?
生成所有公平组队集合的Python实现
问题本质
要生成所有满足要求的队伍集合,核心是为每个等级的队员生成置换排列(每个队员仅分配到一支队伍),再将不同等级的置换组合,确保每支队伍包含各等级一名队员,且所有队员不重复。
定义队员数据
首先定义各等级的队员列表:
rank1 = ['Liam', 'Emma', 'Noah', 'Olivia', 'Ava'] rank2 = ['Ethan', 'Sophia', 'Isabella', 'Jackson', 'Mia'] rank3 = ['Aiden', 'Amelia', 'Lucas', 'Harper', 'Mason'] rank4 = ['Ella', 'Logan', 'Grace', 'James', 'Lily'] rank5 = ['Benjamin', 'Chloe', 'Jacob', 'Scarlett', 'Michael'] ranks = [rank1, rank2, rank3, rank4, rank5]
实现代码
1. 生成所有含队伍顺序的集合
此方法将不同队伍编号视为不同集合(如队伍1和队伍2交换算新集合),总数量为(5!)^5(约248亿种,仅适合迭代处理部分结果):
import itertools def generate_all_team_sets(): # 遍历所有等级的排列组合,每个排列对应该等级队员到队伍的分配 for perms in itertools.product(itertools.permutations(range(5)), repeat=5): teams = [[] for _ in range(5)] # 根据排列构建队伍 for rank_idx, perm in enumerate(perms): for team_idx, member_idx in enumerate(perm): teams[team_idx].append(ranks[rank_idx][member_idx]) # 格式化为示例样式 formatted = [f"Team {i+1}: {', '.join(f'{m!r}' for m in team)}" for i, team in enumerate(teams)] yield formatted
2. 生成去重的队伍集合
若认为队伍编号不影响集合唯一性(如队伍顺序互换算同一集合),可固定Rank1的排列以减少重复计算,总数量为(5!)^4(约2亿种):
def generate_unique_team_sets(): # 固定Rank1的分配顺序,避免队伍编号重复导致的冗余集合 fixed_rank1_perm = tuple(range(5)) # 遍历Rank2到Rank5的所有排列组合 for perms in itertools.product(itertools.permutations(range(5)), repeat=4): full_perms = (fixed_rank1_perm,) + perms teams = [[] for _ in range(5)] for rank_idx, perm in enumerate(full_perms): for team_idx, member_idx in enumerate(perm): teams[team_idx].append(ranks[rank_idx][member_idx]) formatted = [f"Team {i+1}: {', '.join(f'{m!r}' for m in team)}" for i, team in enumerate(teams)] yield formatted
使用示例
迭代输出前3种结果:
if __name__ == "__main__": print("前3种含队伍顺序的集合:") for idx, team_set in enumerate(generate_all_team_sets()): if idx >= 3: break print("\n".join(team_set)) print("-"*50) print("\n前3种去重后的集合:") for idx, team_set in enumerate(generate_unique_team_sets()): if idx >= 3: break print("\n".join(team_set)) print("-"*50)
注意事项
- 由于总数量极大,必须通过迭代器逐个处理结果,避免一次性生成所有集合导致内存溢出。
- 若需自定义规则(如禁止特定队员同队),可在生成队伍后添加条件判断过滤。
内容的提问来源于stack exchange,提问作者Daniel Rodrigues
相关产品推荐
相关产品推荐

