首页 文章

获取许多可能的组合Python [重复]

提问于
浏览
0

这个问题在这里已有答案:

如何知道生成组合时使用的字符数和一系列长度的数量 combinations .

为了得到所有 permutations 我会使用:

chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
minLen = 1
maxLen = 3

total = 0
for i in range(minLen,maxLen+1):
    total += len(chars)**i

我如何为 combinations 这样做?当重复是 not 时 .

我确定有一个数学公式可以做到这一点,但我无法在任何地方找到它 .

谢谢!

EDIT:
我意识到代码可能不可读,所以这里是一个explenation:

很明显变量是什么:最小组合长度,最大值,使用过的字符......

for循环从1到3,每次将它加到 total :字符长度(len(字符))到i的幂(当前迭代的长度) .

这是计算排列的基本方法 .

2 回答

  • 1

    那么,你实际上需要一种方法来计算二项式系数,对吧?

    import math
    
    def binomial_cooefficient(n: int, k: int) -> int:
        n_fac = math.factorial(n)
        k_fac = math.factorial(k)
        n_minus_k_fac = math.factorial(n - k)
        return n_fac/(k_fac*n_minus_k_fac)
    

    这可能不是最优化的实现,但它的工作原理:)

  • 1

    我相信你正在寻找scipy.misc.comb(它给你一个二项式的独特组合的数量(从N取X的形式):

    >>> from scipy.misc import comb
    >>> comb(10, 1) # Num of unique combinations of *from 10 take 1*
    10.0
    >>> comb(10, 2) # Num of unique combinations of *from 10 take 2*
    45.0
    

    等等..然后你可以得到一个很好的减少:

    >>> total_len = 10
    >>> min_size = 1
    >>> max_size = 2
    >>> reduce(lambda acc, x: acc + comb(total_len, x), range(min_size, max_size+1), 0)
    55.0
    

    以上 reduce 是您的1-liner功能等同物:

    >>> total = 0
        for x in range(min_size, max_size+1):
            total += comb(total_len, x)
    

    作为旁注,如果使用 comb(total_len, x, exact=True) ,您将得到整数而不是浮点数的结果 .

相关问题