2017-06-12 50 views
-1

我想制定一個算法來洗牌列表,然後根據這條規則製作一個所有組合的新列表:我該如何將這個列表換成這個規則?

您只能交換一對。例如:

array = [1, 2, 3] 
[3, 2, 1]  #number at index 0 switched with number at index 2 

有關如何編寫它的任何想法?

編輯: Saschas代碼運行良好。我問這個問題之前寫了這個代碼:

sols = [] 
for i in range(len(a)): 
    for j in range(len(a)): 
     a[i] = a[j] 
     a[j] = a[i] 
     sols_perm.append(a) 

我知道我會得到列表中的一些相同的元素,因爲無序對的,但它只是創造了一個完整的相同元素的列表。任何想法爲什麼?

+0

你的交換是錯誤的。您需要一個臨時變量(在用於設置[j]之前更改了一個[i])。我的方法中的代碼工作不同(python風格的交換)!下次直接添加代碼! – sascha

回答

0
sols = [] 
for i in range(len(array)): 
    for j in range(i+1, len(array)): # symmetry-reduction -> ordered pairs 
     sol = array[:]     # copy list 
     sol[i], sol[j] = sol[j], sol[i] # swap 
     sols.append(sol) 
+0

謝謝,檢查編輯! –

0

嘗試下面的功能:

def swap(inlist): 
    n = len(inlist) 
    res = [x for x in inlist] 
    for i in range(n): 
     for j in range(i+1, n): 
      tmp = res[i] 
      res[i] = res[j] 
      res[j] = tmp 
    return res