2016-02-19 38 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我想你的论点的第二点是,一个类可能不必首先。 –