【问题标题】:What is in python, fastest way of reversing a part of a list in place?python中什么是反转列表的一部分的最快方法?
【发布时间】:2020-08-13 22:49:32
【问题描述】:

假设我有一个巨大的列表(比如一千万个元素),我想反转除最后一个之外的所有元素。最简单的方法是:

a[0:-1] = a[-1::-1]

但问题是我认为创建了一个临时列表。如果是这样,如何避免呢?

[编辑] 对于更一般的情况,请考虑反转列表的中间部分:

【问题讨论】:

  • 创建了一个临时列表。为避免这种情况,请使用手动执行此操作的循环。您是否有某些原因试图避免创建中间列表?
  • @LeoArad a[1::-1] 创建一个列表。即使它没有,作为一个实现细节,我很确定切片分配无论如何都会创建一个列表
  • @LeoArad 我相信 OP 指的是a[1::-1],它确实创建了一个新列表
  • @LeoArad 是的,没有人对此提出异议。无论如何都会创建一个新的中间列表
  • 临时对象比解释器开销便宜很多。你为避免临时做的任何事情都会引入过多的解释器开销,不值得。 (你还搞砸了切片端点。)

标签: python list slice


【解决方案1】:

要实现列表反转,除了最后一项,我会这样做 -

>>> a=[1,2,3,4,5]
>>> temp=a.pop()
>>> a.reverse()
>>> a.append(temp)
>>> print(a)
[4, 3, 2, 1, 5]

【讨论】:

  • 问题已更新,OP 正在寻找更通用的解决方案,而不是除最后一个以外的固定倒车。
  • 所有方法的时间复杂度都相同,O(N)。
【解决方案2】:

您可能希望避免复制列表的唯一原因是您认为它太大而无法进行可能的重复复制。

我认为除了手动操作之外没有其他方法(没有副本):

a = [1, 2, 3, 4, 5, 6]

def revert_slice(first, last, a_list):
    while first < last:
        a_list[first], a_list[last] = a_list[last], a_list[first]
        first += 1
        last -= 1

revert_slice(0, 2, a)
print(a)

输出:

[3, 2, 1, 4, 5, 6]

在调用中,只制作引用的临时副本,而不是列表副本。

【讨论】:

    猜你喜欢
    • 2010-10-19
    • 2019-10-03
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2013-06-07
    • 2021-07-17
    相关资源
    最近更新 更多