我想生成一个组合列表.我会尽量简化我的问题,使之易于理解.

我们有3个变量:

  • x:字母数
  • k:组数
  • n:每组的字母数

我想使用python生成一个包含所有可能组合的列表,而不需要任何重复:我不关心组的顺序以及组中字母的顺序.

例如,x=4,k=2,n=2:

# we start with 4 letters, we want to make 2 groups of 2 letters
letters = ['A','B','C','D']

# here would be a code that generate the list

# Here is the result that is very simple, only 3 combinations exist.
combos = [ ['AB', 'CD'], ['AC', 'BD'], ['AD', 'BC'] ]

因为我不关心组的顺序,也不关心组内的字母,所以['AB', 'CD']['DC', 'BA']是重复的.

这是我真正问题的简化,它有以下值:x = 12k = 4n = 3.我试着使用itertools中的一些函数,但由于字母太多,我的电脑死机了,因为组合太多了.

另一种看待问题的方式是:你有12名球员,你想组成4支由3名球员组成的球队.所有的可能性是什么?

有人能帮我找到一个优化的解决方案来生成这个列表吗?

推荐答案

当然会有更复杂/高效的方法来实现这一点,但对于您的示例,这里有一种在合理时间内有效的方法,并且应该很容易适应其他情况.

它根据您的规格生成独特的团队及其独特组合.

from itertools import combinations

# this assumes that team_size * team_num == len(players) is a given
team_size = 3
team_num = 4
players = list('ABCDEFGHIJKL')
unique_teams = [set(c) for c in combinations(players, team_size)]

def duplicate_player(combo):
    """Returns True if a player occurs in more than one team"""
    return len(set.union(*combo)) < len(players)
    
result = (combo for combo in combinations(unique_teams, team_num) if not duplicate_player(combo))

result是一个生成器,可以用list(result)迭代或转换成一个列表.在卡格尔.com,生成所有可能组合的完整列表需要一分钟左右(总共15400个,与@bicker和@John Coleman在 comments 中的计算一致).这些团队是集合的元组,如下所示:

[({'A', 'B', 'C'}, {'D', 'E', 'F'}, {'G', 'H', 'I'}, {'J', 'K', 'L'}),
 ({'A', 'B', 'C'}, {'D', 'E', 'F'}, {'G', 'H', 'J'}, {'I', 'K', 'L'}),
 ({'A', 'B', 'C'}, {'D', 'E', 'F'}, {'G', 'H', 'K'}, {'I', 'J', 'L'}),
 ...
]

如果你愿意,你可以通过调用''.join()将它们转换成字符串.

Python相关问答推荐

Pandas使用过滤器映射多列

在后台运行的Python函数

如何匹配3D圆柱体的轴和半径?

Pandas 填充条件是另一列

大Pandas 胚胎中产生组合

替换字符串中的多个重叠子字符串

Pandas 都是(),但有一个门槛

从dict的列中分钟

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

如何从.cgi网站刮一张表到rame?

无法使用requests或Selenium抓取一个href链接

OR—Tools CP SAT条件约束

PyQt5,如何使每个对象的 colored颜色 不同?'

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

所有列的滚动标准差,忽略NaN

未知依赖项pin—1阻止conda安装""

用砂箱开发Web统计分析

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

如何合并具有相同元素的 torch 矩阵的行?

mdates定位器在图表中显示不存在的时间间隔