python 排列组合

来源:互联网 发布:java父类指向子类 编辑:程序博客网 时间:2024/05/29 09:58

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

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

1.计算排列组合数

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

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

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

# --coding=utf-8--import operatorimport stringprint ("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

0 0
原创粉丝点击