Pythono 实现 Permutation

不管在R 还是python中,都有现成的函数来轻而易举地进行全排列(Permutation)、无序排列等等。今天想要尝试一下使用自己写代码来实现全排列。

首先,我采用的算法如下:

对于一个数列 i.e. 1,2,3,4   想要进行全排列:

在第一个位置可以放入1 ,2,3,4

如果第一个位置为1, 第二个位置则 只能放 2,3,4 ...

如果第一、二个位置为1,2, 第三个位置只能放3 or 4  

大致思路:

第一次:[[1],[2],[3],[4]]

第二次:[[[1],[2]],[[1],[3]],[[1],[4]],...]

第三次:[[[1],[2],[3]],[[1],[2],[4]],[[1],[3],[2]],...]

第四次:[[[1],[2],[3],[4]],[[1],[2],[4],[3]],...]

在这样的思想下,写出如下代码:

 1 n = 5
 2 List = [[1],[2],[3],[4],[5]] #数据结构非常重要,如果是[1,2,3,4,5]则很难work!
 3 Grow_List = List
 4 Count = 1
 5 while Count <= (n-1):
 6     Output_List = []  #每一次循环完毕将Output_List归零,这个非常重要。否则会导致Output_List仍包含之前内容
 7     for i in Grow_List:
 8         Temp = List[:] #浅拷贝非常重要!如果不是浅拷贝,将导致List的改变
 9         print "i:",i
10         if len(i) == 1: #发现在i为一个元素和多个元素的时候,需要做的事情不同,
11             Temp.remove(i) #将已有元素移除掉,便于进行排列组合
12         elif len(i) >=2:
13             for j in i:
14                 Temp.remove(j) 
15         for k in Temp:
16             if len(i) == 1: #i为一个元素和多个元素的时候,所需操作略有不同
17                 t = [i[:]]
18             elif len(i) >=2:
19                 t = i[:]
20             t.append(k) #先对元素进行添加,再添加到Output_List当中
21             print "t:",t
22             Output_List.append(t)
23     Grow_List = Output_List
24     Count += 1

总之,短短二十多行代码,写了不少时间。看来在算法方面还是需要大大地提高!

posted on 2013-10-05 15:27  Forever_YCC  阅读(6594)  评论(0编辑  收藏  举报

导航