python 排列组合

python的一个特点就是其强大的扩展库,在做列表和一些其他字符操作时非常方便。

数学中最常见的一个计算问题是排列组合数的计算

python 排列组合_第1张图片

python 排列组合_第2张图片

1.计算排列组合数

当m和n比较小的时候,用手比较容易得到结果,比如C(4,2)=6,A(5,3)=60

但当数据比较大的时候,计算起来就不那么容易了,比如C(17,4)=2380

为此,可以采用下面的文件进行交互式的得到计算结果:

# --coding=utf-8--
import operator
import string
print ("input n and k:")
strn=raw_input("n:")
strk=raw_input("k:")
n=string.atoi(strn)
k=string.atoi(strk)
def c(n,k):  
    return  reduce(operator.mul, range(n - k + 1, n + 1)) /reduce(operator.mul, range(1, k +1))  
def fac(n):  
    return  reduce(operator.mul, range(1,n+1))  
def a(n,k):  
    return  reduce(operator.mul, range(n - k + 1, n + 1))

if __name__ == '__main__':
    cc=c(n,k)
    aa=a(n,k)
    fa=fac(n)  
    print ("c(n,k)= %s" %cc)
    print ("a(n,k)= %s" %aa) 
    print ("fac(n,k)= %s" %fa) 
其中fac()函数是计算阶乘的函数,上述用到了python的reduce函数,解释如下:

python中的reduce内建函数是一个二元操作函数,用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:

用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。
如:

    def myadd(x,y):  
        return x+y  
    sum=reduce(myadd,(1,2,3,4,5,6,7))  
    print sum  
#结果就是输出1+2+3+4+5+6+7的结果即28
当然,也可以用lambda的方法,更为简单:

    sum=reduce(lambda x,y:x+y,(1,2,3,4,5,6,7))  
    print sum 
值得注意的是在python 3.0.0.0以后, reduce已经不在built-in function里了, 要用它就得from functools import reduce.

2.得到详细的排列组合结果

如果希望根据给出的详细数据,得到所有的可能排列组合,就需要使用python的itertools模块

详细如下:有序排列

import itertools 
print list(itertools.permutations([1,2,3,4],2))
会得到[(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]

同样的,无序组合也可以:

import itertools 
print list(itertools.combinations([1,2,3,4],2))
会得到:[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

参考文章:

http://www.tuicool.com/articles/vIRryi

http://blog.csdn.net/perfumekristy/article/details/8526336

http://blog.csdn.net/chjjunking/article/details/6859135

你可能感兴趣的:(python)