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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:58:12