首页 > 解决方案 > 给定总体和子集,如何创建所有组合的列表?(nCr)

问题描述

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

对于此示例,假设总体为 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]]

标签: pythonmathstatistics

解决方案


您可以生成您拥有的 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]]

推荐阅读