除了这样做:

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


[出]:

131071



如何数学计算所有可能组合的数量?
有没有一种方法可以在不枚举可能的组合的情况下进行计算?

最佳答案

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

例如,考虑列表['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,所以我们有23-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




对于所有组合:

关于python - 如何计算1到N范围内的所有可能组合的数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30847280/

10-13 09:06
查看更多