与重复的组合
Combinations with repetitions
使用itertools.combinations
(或任何其他函数)我想知道有多少组合可以满足以下要求:
- 有4个数组,每个数组的长度分别为
5, 6, 7, 8
。
- 组合由 5 个元素组成
所以每个数组是:
A = ['A', 'A', 'A', 'A', 'A']
B = ['B', 'B', 'B', 'B', 'B', 'B']
C = ['C', 'C', 'C', 'C', 'C', 'C', 'C']
D = ['D', 'D', 'D', 'D', 'D', 'D', 'D', 'D']
例如,组合为:('A', 'A', 'A', 'A', 'A')
或 ('A', 'D', 'D', 'B', 'C')
。订单无关紧要。
我该怎么做?
将所有四个列表添加到一个列表中,然后将参数设置为combinations
函数。您还可以将所有列表添加到 combination
函数中。
from itertools import combinations
A = ['A', 'A', 'A', 'A', 'A']
B = ['B', 'B', 'B', 'B', 'B', 'B']
C = ['C', 'C', 'C', 'C', 'C', 'C', 'C']
D = ['D', 'D', 'D', 'D', 'D', 'D', 'D', 'D']
comb = combinations(A+B+C+D, 5)
for c in comb:
print(c)
既然你提到顺序无关紧要,我认为对于你的例子,正确答案应该只产生 56
组合。
你可以使用这个:
from itertools import combinations_with_replacement
combi = list(combinations_with_replacement(set(A+B+C+D), 5))
对于您的示例,使用此解决方案,print(len(combi))
和 print(combi)
产生以下输出:
56
[('C', 'C', 'C', 'C', 'C'),
('C', 'C', 'C', 'C', 'A'),
('C', 'C', 'C', 'C', 'B'),
('C', 'C', 'C', 'C', 'D'),
('C', 'C', 'C', 'A', 'A'),
('C', 'C', 'C', 'A', 'B'),
('C', 'C', 'C', 'A', 'D'),
('C', 'C', 'C', 'B', 'B'),
('C', 'C', 'C', 'B', 'D'),
('C', 'C', 'C', 'D', 'D'),
('C', 'C', 'A', 'A', 'A'),
('C', 'C', 'A', 'A', 'B'),
('C', 'C', 'A', 'A', 'D'),
('C', 'C', 'A', 'B', 'B'),
('C', 'C', 'A', 'B', 'D'),
('C', 'C', 'A', 'D', 'D'),
('C', 'C', 'B', 'B', 'B'),
('C', 'C', 'B', 'B', 'D'),
('C', 'C', 'B', 'D', 'D'),
('C', 'C', 'D', 'D', 'D'),
('C', 'A', 'A', 'A', 'A'),
('C', 'A', 'A', 'A', 'B'),
('C', 'A', 'A', 'A', 'D'),
('C', 'A', 'A', 'B', 'B'),
('C', 'A', 'A', 'B', 'D'),
('C', 'A', 'A', 'D', 'D'),
('C', 'A', 'B', 'B', 'B'),
('C', 'A', 'B', 'B', 'D'),
('C', 'A', 'B', 'D', 'D'),
('C', 'A', 'D', 'D', 'D'),
('C', 'B', 'B', 'B', 'B'),
('C', 'B', 'B', 'B', 'D'),
('C', 'B', 'B', 'D', 'D'),
('C', 'B', 'D', 'D', 'D'),
('C', 'D', 'D', 'D', 'D'),
('A', 'A', 'A', 'A', 'A'),
('A', 'A', 'A', 'A', 'B'),
('A', 'A', 'A', 'A', 'D'),
('A', 'A', 'A', 'B', 'B'),
('A', 'A', 'A', 'B', 'D'),
('A', 'A', 'A', 'D', 'D'),
('A', 'A', 'B', 'B', 'B'),
('A', 'A', 'B', 'B', 'D'),
('A', 'A', 'B', 'D', 'D'),
('A', 'A', 'D', 'D', 'D'),
('A', 'B', 'B', 'B', 'B'),
('A', 'B', 'B', 'B', 'D'),
('A', 'B', 'B', 'D', 'D'),
('A', 'B', 'D', 'D', 'D'),
('A', 'D', 'D', 'D', 'D'),
('B', 'B', 'B', 'B', 'B'),
('B', 'B', 'B', 'B', 'D'),
('B', 'B', 'B', 'D', 'D'),
('B', 'B', 'D', 'D', 'D'),
('B', 'D', 'D', 'D', 'D'),
('D', 'D', 'D', 'D', 'D')]
使用itertools.combinations
(或任何其他函数)我想知道有多少组合可以满足以下要求:
- 有4个数组,每个数组的长度分别为
5, 6, 7, 8
。 - 组合由 5 个元素组成
所以每个数组是:
A = ['A', 'A', 'A', 'A', 'A']
B = ['B', 'B', 'B', 'B', 'B', 'B']
C = ['C', 'C', 'C', 'C', 'C', 'C', 'C']
D = ['D', 'D', 'D', 'D', 'D', 'D', 'D', 'D']
例如,组合为:('A', 'A', 'A', 'A', 'A')
或 ('A', 'D', 'D', 'B', 'C')
。订单无关紧要。
我该怎么做?
将所有四个列表添加到一个列表中,然后将参数设置为combinations
函数。您还可以将所有列表添加到 combination
函数中。
from itertools import combinations
A = ['A', 'A', 'A', 'A', 'A']
B = ['B', 'B', 'B', 'B', 'B', 'B']
C = ['C', 'C', 'C', 'C', 'C', 'C', 'C']
D = ['D', 'D', 'D', 'D', 'D', 'D', 'D', 'D']
comb = combinations(A+B+C+D, 5)
for c in comb:
print(c)
既然你提到顺序无关紧要,我认为对于你的例子,正确答案应该只产生 56
组合。
你可以使用这个:
from itertools import combinations_with_replacement
combi = list(combinations_with_replacement(set(A+B+C+D), 5))
对于您的示例,使用此解决方案,print(len(combi))
和 print(combi)
产生以下输出:
56
[('C', 'C', 'C', 'C', 'C'),
('C', 'C', 'C', 'C', 'A'),
('C', 'C', 'C', 'C', 'B'),
('C', 'C', 'C', 'C', 'D'),
('C', 'C', 'C', 'A', 'A'),
('C', 'C', 'C', 'A', 'B'),
('C', 'C', 'C', 'A', 'D'),
('C', 'C', 'C', 'B', 'B'),
('C', 'C', 'C', 'B', 'D'),
('C', 'C', 'C', 'D', 'D'),
('C', 'C', 'A', 'A', 'A'),
('C', 'C', 'A', 'A', 'B'),
('C', 'C', 'A', 'A', 'D'),
('C', 'C', 'A', 'B', 'B'),
('C', 'C', 'A', 'B', 'D'),
('C', 'C', 'A', 'D', 'D'),
('C', 'C', 'B', 'B', 'B'),
('C', 'C', 'B', 'B', 'D'),
('C', 'C', 'B', 'D', 'D'),
('C', 'C', 'D', 'D', 'D'),
('C', 'A', 'A', 'A', 'A'),
('C', 'A', 'A', 'A', 'B'),
('C', 'A', 'A', 'A', 'D'),
('C', 'A', 'A', 'B', 'B'),
('C', 'A', 'A', 'B', 'D'),
('C', 'A', 'A', 'D', 'D'),
('C', 'A', 'B', 'B', 'B'),
('C', 'A', 'B', 'B', 'D'),
('C', 'A', 'B', 'D', 'D'),
('C', 'A', 'D', 'D', 'D'),
('C', 'B', 'B', 'B', 'B'),
('C', 'B', 'B', 'B', 'D'),
('C', 'B', 'B', 'D', 'D'),
('C', 'B', 'D', 'D', 'D'),
('C', 'D', 'D', 'D', 'D'),
('A', 'A', 'A', 'A', 'A'),
('A', 'A', 'A', 'A', 'B'),
('A', 'A', 'A', 'A', 'D'),
('A', 'A', 'A', 'B', 'B'),
('A', 'A', 'A', 'B', 'D'),
('A', 'A', 'A', 'D', 'D'),
('A', 'A', 'B', 'B', 'B'),
('A', 'A', 'B', 'B', 'D'),
('A', 'A', 'B', 'D', 'D'),
('A', 'A', 'D', 'D', 'D'),
('A', 'B', 'B', 'B', 'B'),
('A', 'B', 'B', 'B', 'D'),
('A', 'B', 'B', 'D', 'D'),
('A', 'B', 'D', 'D', 'D'),
('A', 'D', 'D', 'D', 'D'),
('B', 'B', 'B', 'B', 'B'),
('B', 'B', 'B', 'B', 'D'),
('B', 'B', 'B', 'D', 'D'),
('B', 'B', 'D', 'D', 'D'),
('B', 'D', 'D', 'D', 'D'),
('D', 'D', 'D', 'D', 'D')]