我正在尝试获取具有给定总体和给定子集的所有组合的列表列表。
在这个例子中,假设有 12 个人和 3 的子集。根据组合公式 (nCr),我知道应该有 220 种组合。如何获得所有 220 种可能组合的列表?
示例结果:
[[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
etc.,
etc.,
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1]]
答案 0 :(得分:1)
您可以生成 3 个索引的所有可能组合,并相应地构建每个输出:
from itertools import combinations
def combs(n, r):
for comb in combinations(range(n), r):
yield [1 if i in comb else 0 for i in range(n)]
使用您的值运行示例:
c = list(combs(12, 3))
print(len(c))
# 220
我们有预期的组合数,请看第一个:
print(c[:5])
# [[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
# [1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
# [1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
# [1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
# [1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]]