如何计算从1到N的一系列数字的所有可能组合的数量?

时间:2015-06-15 14:06:35

标签: python math combinations itertools

除此之外:

from itertools import combinations
def brute_force(x):
    for l in range (1,len(x)+1):
        for f in list(combinations(range(0,len(x)),l)):
            yield f
x = range(1,18)
len(list(brute_force(x)))

[OUT]:

131071
  • 我如何以数学方式计算所有可能组合的数量?

  • 有没有办法在不计算可能的组合的情况下进行计算?

2 个答案:

答案 0 :(得分:7)

始终存在 2 n -1 集合{1,...,n}的非空子集。

例如,考虑列表['a','b','c']

>>> [list(combinations(['a','b','c'],i)) for i in range(1,4)]
[[('a',), ('b',), ('c',)], [('a', 'b'), ('a', 'c'), ('b', 'c')], [('a', 'b', 'c')]]
>>> l=[list(combinations(['a','b','c'],i)) for i in range(1,4)]
>>> sum(map(len,l))
7

我们列表的长度是3,所以我们有2个 3 -1 = 7个组合。

对于range(10)

>>> l=[list(combinations(range(10),i)) for i in range(1,11)]
>>> sum(map(len,l))
1023      #2^10-1 = 1024-1=1023

注意,如果您想计算空子集,可以使用2^n

实际上从数学的角度来看:

  

集合的k组合是S的k个不同元素的子集。如果集合具有n个元素,则k组合的数量等于binomial coefficient

enter image description here

以及所有组合:

enter image description here

答案 1 :(得分:1)

假设您有[1, 10)的列表,并且您想选择3

在数学上

>>> math.factorial(9) // (math.factorial(3) * math.factorial(6))
84

这是combinations

的定义
_____n!_____
 k!(n - k)!

所以作为一般功能

def num_combinations(n, k):
    return math.factorial(n) // (math.factorial(k), math.factorial(n-k))

蛮力

>>> len(list(itertools.combinations(range(1,10), 3)))
84