2016-02-19 60 views
1

當我使用排序函數對列表的末尾進行排序時,用於查找整數列表的下一個排列的此代碼不會給出正確的答案。但是如果我使用排序函數,它給了我正確的答案。爲什麼會發生?請有人幫我解決這個問題。Python排序列表的一部分

def nextPermutation(self, A): 
    n = len(A) 
    if n == 1: 
     return A 
    i = n - 2 
    m = A[n - 1] 
    while i >= 0: 
     if A[i] < m: 
      j = i + 1 
      while j < len(A) and A[i] < A[j]: 
       j += 1 
      A[i], A[j - 1] = A[j - 1], A[i] 
      A[i + 1 :].sort() #Here if I use sorted it gives the correct answer 
      return A 
     else: 
      m = max(A[i], m) 
     i -= 1 
    A.sort() 
    return A 
+2

您分得一杯羹,排序,並把它扔掉。 –

+0

嘗試刪除/註釋掉該行。這應該與排序(A [i + 1:])具有相同的結果,因爲它會創建一個你永遠不會使用的副本 –

+0

你的代碼行使用'sorted()'的樣子是什麼? – jsfan

回答

0

切片創建列表的副本。當你說A[i + 1:].sort()你正在創建一些A的內容的副本,然後對它們進行排序。它不會影響A。試試這個:

B = A[i + 1:] 
B.sort() 
return B 

當然,這將是更容易使用sorted(),只是return sorted(A[i + 1:]),但是從你的問題,我認爲由於某種原因,你不感興趣。

+0

OP需要改變'A';設計將「列表」向前移動一個排列,所以不要部分排列「A」意味着它不適用。 – ShadowRanger

0

那麼,在線路A[i+1:].sort(),該A[i+1:]部分創建一個新名單對象。然後,.sort()部分對該列表進行排序。然後,這個新的對象被拋棄而不被分配任何東西。因此,該行對您的代碼沒有影響。

我不知道爲什麼你正在經歷這一切麻煩,但因爲它會更容易編寫類:

from itertools import permutations 

class PermutationList: 
    def __init__(self, pool): 
     self.pool = pool 
     self._generator = permutations(self.pool) 

    def __iter__(self): 
     while True: 
      try: 
       yield list(next(self._generator)) 
      except StopIteration: 
       self._generator = permutations(self.pool) 
       raise StopIteration 

test_list = PermutationList([1,2,3,4]) 

for perm in test_list: 
    print perm 

# Output 
# [1, 2, 3, 4] 
# [1, 2, 4, 3] 
# [1, 3, 2, 4] 
# ... 
# [4, 3, 2, 1] 
+0

爲什麼連一個特殊班都打擾? '在地圖中使用perm(列表,排列([1,2,3,4])):'。完成。如果你不需要'list'結果,你可以將'tuple's作爲'itertools.permutations'返回它們,而不用'map(list,...)'包裝。該課程只是增加了一大堆毫無意義的開銷。 – ShadowRanger

+0

@ShadowRanger從原始文章中,該方法有自我作爲參數,所以我在一個類中給出了一個例子。對於這個簡單的例子來說,這是一堆開銷,但是它是在不考慮開銷的情況下編寫的。 –

+0

@ShadowRanger我想你的論點的第二點是,一個類可能不必首先。 –