如何获知一些可能的组合,知道在生成组合时使用的字符数和一系列长度。
要获得所有排列,我会使用:
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的幂(当前迭代的长度)。
这是计算排列的基本方法。
答案 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)
,您将得到整数而不是浮点数。