Python编程之黑板上排列组合,你舍得解开吗
考虑这样一个问题,给定一个矩阵(多维数组,numpy.ndarray()),如何shuffle这个矩阵(也就是对其行进行全排列),如何随机地选择其中的k行,这叫组合,实现一种某一维度空间的切片。例如五列中选三列(全部三列的排列数),便从原有的五维空间中降维到三维空间,因为是全部的排列数,故不会漏掉任何一种可能性。
涉及的函数主要有:
itertools.combinations()
itertools.permutations()
#1.对0-5之间的数进行一次全排列 >>>np.random.permutation(6) array([3,1,5,4,0,2]) #2.创建待排矩阵 >>>A=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) #3.shuffle矩阵A >>>p=np.random.permutation(A.shape[0]) >>>p array([1,2,0]) >>>A[p,:] array([[5,6,7,8], [9,10,11,12], [1,2,3,4]])
C52的实现
>>>fromitertoolsimportcombinations >>>combins=[cforcincombinations(range(5),2)] >>>len(combins) 10 >>>combins#而且是按序排列 [(0,1),(0,2),(0,3),(0,4),(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
A52的实现
>>>fromitertoolsimportpermutations >>>pertumations(range(5),2)>>>perms=permutations(range(5),2) >>>perms [(0,1),(0,2),(0,3),(0,4),(1,0),(1,2),(1,3),(1,4),(2,0),(2,1), (2,3),(2,4),(3,0),(3,1),(3,2),(3,4),(4,0),(4,1),(4,2),(4,3)] >>>len(perms) 20
#5.任取其中的k(k=2)行 >>>c=[cforcincombinations(range(A.shape[0]),2)] >>>A[c[0],:]#一种排列 array([[1,2,3,4], [5,6,7,8]])
下面再介绍一个列表数据任意组合,主要是利用自带的库
#_*_coding:utf-8_*_ #__author__='dragon' importitertools list1=[1,2,3,4,5] list2=[] foriinrange(1,len(list1)+1): iter=itertools.combinations(list1,i) list2.append(list(iter)) print(list2)
[[(1,),(2,),(3,),(4,),(5,)],[(1,2),(1,3),(1,4),(1,5),(2,3),(2,4),(2,5),(3,4),(3,5),(4,5)],[(1,2,3),(1,2,4),(1,2,5),(1,3,4),(1,3,5),(1,4,5),(2,3,4),(2,3,5),(2,4,5),(3,4,5)],[(1,2,3,4),(1,2,3,5),(1,2,4,5),(1,3,4,5),(2,3,4,5)],[(1,2,3,4,5)]]
排列的实现
#_*_coding:utf-8_*_ #__author__='dragon' importitertools list1=[1,2,3,4,5] list2=[] foriinrange(1,len(list1)+1): iter=itertools.permutations(list1,i) list2.append(list(iter)) print(list2)
运行结果:
[[(1,),(2,),(3,),(4,),(5,)],[(1,2),(1,3),(1,4),(1,5),(2,1),(2,3),(2,4),(2,5),(3,1),(3,2),(3,4),(3,5),(4,1),(4,2),(4,3),(4,5),(5,1),(5,2),(5,3),(5,4)],[(1,2,3),(1,2,4),(1,2,5),(1,3,2),(1,3,4),(1,3,5),(1,4,2),(1,4,3),(1,4,5),(1,5,2),(1,5,3),(1,5,4),(2,1,3),(2,1,4),(2,1,5),(2,3,1),(2,3,4),(2,3,5),(2,4,1),(2,4,3),(2,4,5),(2,5,1),(2,5,3),(2,5,4),(3,1,2),(3,1,4),(3,1,5),(3,2,1),(3,2,4),(3,2,5),(3,4,1),(3,4,2),(3,4,5),(3,5,1),(3,5,2),(3,5,4),(4,1,2),(4,1,3),(4,1,5),(4,2,1),(4,2,3),(4,2,5),(4,3,1),(4,3,2),(4,3,5),(4,5,1),(4,5,2),(4,5,3),(5,1,2),(5,1,3),(5,1,4),(5,2,1),(5,2,3),(5,2,4),(5,3,1),(5,3,2),(5,3,4),(5,4,1),(5,4,2),(5,4,3)],[(1,2,3,4),(1,2,3,5),(1,2,4,3),(1,2,4,5),(1,2,5,3),(1,2,5,4),(1,3,2,4),(1,3,2,5),(1,3,4,2),(1,3,4,5),(1,3,5,2),(1,3,5,4),(1,4,2,3),(1,4,2,5),(1,4,3,2),(1,4,3,5),(1,4,5,2),(1,4,5,3),(1,5,2,3),(1,5,2,4),(1,5,3,2),(1,5,3,4),(1,5,4,2),(1,5,4,3),(2,1,3,4),(2,1,3,5),(2,1,4,3),(2,1,4,5),(2,1,5,3),(2,1,5,4),(2,3,1,4),(2,3,1,5),(2,3,4,1),(2,3,4,5),(2,3,5,1),(2,3,5,4),(2,4,1,3),(2,4,1,5),(2,4,3,1),(2,4,3,5),(2,4,5,1),(2,4,5,3),(2,5,1,3),(2,5,1,4),(2,5,3,1),(2,5,3,4),(2,5,4,1),(2,5,4,3),(3,1,2,4),(3,1,2,5),(3,1,4,2),(3,1,4,5),(3,1,5,2),(3,1,5,4),(3,2,1,4),(3,2,1,5),(3,2,4,1),(3,2,4,5),(3,2,5,1),(3,2,5,4),(3,4,1,2),(3,4,1,5),(3,4,2,1),(3,4,2,5),(3,4,5,1),(3,4,5,2),(3,5,1,2),(3,5,1,4),(3,5,2,1),(3,5,2,4),(3,5,4,1),(3,5,4,2),(4,1,2,3),(4,1,2,5),(4,1,3,2),(4,1,3,5),(4,1,5,2),(4,1,5,3),(4,2,1,3),(4,2,1,5),(4,2,3,1),(4,2,3,5),(4,2,5,1),(4,2,5,3),(4,3,1,2),(4,3,1,5),(4,3,2,1),(4,3,2,5),(4,3,5,1),(4,3,5,2),(4,5,1,2),(4,5,1,3),(4,5,2,1),(4,5,2,3),(4,5,3,1),(4,5,3,2),(5,1,2,3),(5,1,2,4),(5,1,3,2),(5,1,3,4),(5,1,4,2),(5,1,4,3),(5,2,1,3),(5,2,1,4),(5,2,3,1),(5,2,3,4),(5,2,4,1),(5,2,4,3),(5,3,1,2),(5,3,1,4),(5,3,2,1),(5,3,2,4),(5,3,4,1),(5,3,4,2),(5,4,1,2),(5,4,1,3),(5,4,2,1),(5,4,2,3),(5,4,3,1),(5,4,3,2)],[(1,2,3,4,5),(1,2,3,5,4),(1,2,4,3,5),(1,2,4,5,3),(1,2,5,3,4),(1,2,5,4,3),(1,3,2,4,5),(1,3,2,5,4),(1,3,4,2,5),(1,3,4,5,2),(1,3,5,2,4),(1,3,5,4,2),(1,4,2,3,5),(1,4,2,5,3),(1,4,3,2,5),(1,4,3,5,2),(1,4,5,2,3),(1,4,5,3,2),(1,5,2,3,4),(1,5,2,4,3),(1,5,3,2,4),(1,5,3,4,2),(1,5,4,2,3),(1,5,4,3,2),(2,1,3,4,5),(2,1,3,5,4),(2,1,4,3,5),(2,1,4,5,3),(2,1,5,3,4),(2,1,5,4,3),(2,3,1,4,5),(2,3,1,5,4),(2,3,4,1,5),(2,3,4,5,1),(2,3,5,1,4),(2,3,5,4,1),(2,4,1,3,5),(2,4,1,5,3),(2,4,3,1,5),(2,4,3,5,1),(2,4,5,1,3),(2,4,5,3,1),(2,5,1,3,4),(2,5,1,4,3),(2,5,3,1,4),(2,5,3,4,1),(2,5,4,1,3),(2,5,4,3,1),(3,1,2,4,5),(3,1,2,5,4),(3,1,4,2,5),(3,1,4,5,2),(3,1,5,2,4),(3,1,5,4,2),(3,2,1,4,5),(3,2,1,5,4),(3,2,4,1,5),(3,2,4,5,1),(3,2,5,1,4),(3,2,5,4,1),(3,4,1,2,5),(3,4,1,5,2),(3,4,2,1,5),(3,4,2,5,1),(3,4,5,1,2),(3,4,5,2,1),(3,5,1,2,4),(3,5,1,4,2),(3,5,2,1,4),(3,5,2,4,1),(3,5,4,1,2),(3,5,4,2,1),(4,1,2,3,5),(4,1,2,5,3),(4,1,3,2,5),(4,1,3,5,2),(4,1,5,2,3),(4,1,5,3,2),(4,2,1,3,5),(4,2,1,5,3),(4,2,3,1,5),(4,2,3,5,1),(4,2,5,1,3),(4,2,5,3,1),(4,3,1,2,5),(4,3,1,5,2),(4,3,2,1,5),(4,3,2,5,1),(4,3,5,1,2),(4,3,5,2,1),(4,5,1,2,3),(4,5,1,3,2),(4,5,2,1,3),(4,5,2,3,1),(4,5,3,1,2),(4,5,3,2,1),(5,1,2,3,4),(5,1,2,4,3),(5,1,3,2,4),(5,1,3,4,2),(5,1,4,2,3),(5,1,4,3,2),(5,2,1,3,4),(5,2,1,4,3),(5,2,3,1,4),(5,2,3,4,1),(5,2,4,1,3),(5,2,4,3,1),(5,3,1,2,4),(5,3,1,4,2),(5,3,2,1,4),(5,3,2,4,1),(5,3,4,1,2),(5,3,4,2,1),(5,4,1,2,3),(5,4,1,3,2),(5,4,2,1,3),(5,4,2,3,1),(5,4,3,1,2),(5,4,3,2,1)]]
可以根据你需要随意组合
python实现排列组合公式C(m,n)求值
#-*-coding:utf-8-*- #用python实现排列组合C(n,m)=n!/m!*(n-m)! defget_value(n): ifn==1: returnn else: returnn*get_value(n-1) defgen_last_value(n,m): first=get_value(n) print"n:%svalue:%s"%(n,first) second=get_value(m) print"n:%svalue:%s"%(m,second) third=get_value((n-m)) print"n:%svalue:%s"%((n-m),third) returnfirst/(second*third) if__name__=="__main__": #C(12,5) rest=gen_last_value(5,3) print"value:",rest
运行结果:
n:5value:120 n:3value:6 n:2value:2 value:10
以上就是本文关于Python排列组合算法的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python数据结构与算法之列表(链表,linkedlist)简单实现、Python算法之求n个节点不同二叉树个数等,有什么问题可以随时留言,小编会及时回复大家的。