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

總之,短短二十多行代碼,寫了不少時間。看來在算法方面還是需要大大地提高!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM