【问题标题】:Python sorting part of a listPython对列表的一部分进行排序
【发布时间】:2016-06-01 16:45:12
【问题描述】:

当我使用 sort 函数对列表末尾进行排序时,此用于查找整数列表的下一个排列的代码没有给出正确的答案。但是如果我使用 sorted 函数,它会给我正确的答案。为什么会这样?请有人帮我解决这个问题。

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

【问题讨论】:

  • 你取一片,分类然后扔掉。
  • 尝试完全删除/注释掉该行。这应该与 sorted(A[i+1:]) 具有相同的结果,因为这会创建一个您从未使用过的副本
  • 使用sorted() 时你的线路是什么样子的?
  • @jsfan 也许是A[i + 1:] = sorted(A[i + 1:])?我不知道它在算法中是否有意义,但至少它有机会做一些有用的事情。 :)
  • @jsfan A[i + 1 : ] = sorted(A[i + 1:])

标签: python list python-2.7 sorting


【解决方案1】:

切片会创建列表的副本。当您说A[i + 1:].sort() 时,您正在创建A 的一些内容的副本,然后对它们进行排序。它不会影响A。试试这个:

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

当然,使用sorted()return sorted(A[i + 1:]) 会更容易,但从你的问题来看,我认为出于某种原因你对此不感兴趣。

【讨论】:

  • OP需要变异A;该设计将list 向前移动了一个排列,因此不部分排序A 意味着它不能正常工作。
【解决方案2】:

好吧,在A[i+1:].sort() 行中,A[i+1:] 部分创建了一个 列表对象。然后,.sort() 部分对该列表进行排序。然后,这个 new 对象被丢弃而不被分配给任何东西。因此,该行对您的代码没有影响。

我不确定你为什么会遇到所有这些麻烦,但是将类写成这样会更容易:

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]

【讨论】:

  • 为什么还要上一门特殊的课呢? for perm in map(list, permutations([1,2,3,4])):。完毕。如果您不需要list 结果,则可以将tuples 作为itertools.permutations 返回它们而无需map(list, ...) 包装。该课程只是增加了大量无意义的开销。
  • @ShadowRanger 从原帖来看,该方法有 self 作为参数,所以我在一个类中给出了一个例子。对于这个简单的示例来说,这是一堆开销,但它是在假设开销无论如何都存在的情况下编写的。
  • @ShadowRanger 我想第二点有助于你的论点,可能一开始就不需要一个类。
  • @o_o 问题提到我不能使用 permutation() 函数,否则会受到惩罚
猜你喜欢
  • 2020-04-02
  • 1970-01-01
  • 2011-01-17
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多