获得许多可能的Python组合

时间:2015-11-27 14:02:48

标签: python combinations

如何获知一些可能的组合,知道在生成组合时使用的字符数和一系列长度。

要获得所有排列,我会使用:

chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
minLen = 1
maxLen = 3

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

我如何为组合执行此操作?当重复时允许。

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

谢谢!

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

变量的含义非常明显:最小组合长度,最大值,使用过的字符......

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

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

2 个答案:

答案 0 :(得分: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 :(得分: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),您将得到整数而不是浮点数。