给定总体和子集,如何创建所有组合的列表? (nCr)

时间:2021-03-15 19:42:24

标签: python math statistics

我正在尝试获取具有给定总体和给定子集的所有组合的列表列表。

在这个例子中,假设有 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]]

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]]