geekdoc-python-zh/docs/pythoncentral/python-reverse-list-place.md

3.8 KiB
Raw Blame History

Python 中的列表:如何实现就地反转

原文:https://www.pythoncentral.io/python-reverse-list-place/

先决条件

要了解就地列表反转,您应该了解以下内容:

  1. Python 3
  2. Python 数据结构-列表
  3. 交换值

什么是到位列表冲销?

在之前的帖子中,你可能已经学会了如何用 Python 逆向读取列表,这很有趣。你可以在这里查看。然而,这个教程的动机是完全不同的。我们不会反向读取一个列表,而是将一个现有的列表改变成它的反向状态。注意,这是一种语言不可知的方法。

我们来看一个例子:

alist = [1,2,3,4,5,6,7]

print(alist[::-1]) #prints [7,6,5,4,3,2,1]

print(alist) #prints [1,2,3,4,5,6,7]

所以你只不过是在做 *alist[::-1]* 的时候以相反的顺序读。我们要实现的是让 *alist = [7,6,5,4,3,2,1]*

如何实现这一点?

这背后的想法是使用两个指针, 指针指向列表的第一个索引, 指针指向列表的最后一个索引。现在我们交换这些指针所指向的元素。然后,我们将指针移动到下一个索引。这种终止条件将是当左指针等于或越过右指针时。让我们看一个例子:

| 回合 | 列表 | 左 | 右 | 交换后列表 | | 1 | 【1234567】 | 1 [0] | 7 [6] | 【7234561】 | | 2 | 【7234561】 | 2[1] | 6[5] | 【7634521】 | | 3 | 【7234561】 | 3[2] | 5【4】 | 【7654321】 | | 4 | 【7654321】 | 4【3】 | 4【3】 | 停止自左==右 |

如你所见,现在名单颠倒了。

算法

  1. 左 指针指向第一个索引 右 指针指向最后一个索引
  2. 互换元素所指的 指针分别为
  3. 左指针递增 1右指针递减 1
  4. 检查 左> =右 :
    1. 如果没有,重复步骤 2-4
    2. 如果是,停止。清单冲销完成

注意: 虽然这个算法是针对列表解释的,但是你也可以把它用在字符串上。在这种情况下,您可能需要通过类型转换将字符串转换为列表。不要忘记从列表格式重新构造字符串。这可以通过使用一些格式化命令来完成,比如 replace()。

代码

def reverse(alist):

   #intializing pointers
   left = 0
   right = len(alist)-1

   #condition for termination
   while left<right:

       #swapping
       temp = alist[left]
       alist[left] = alist[right]
       alist[right] = temp

       #updating pointers
       left += 1
       right -= 1

   return alist

print(reverse([1,2,3,4,5]))

效率

你可能会想,你可以用反转的内容创建一个新列表,而不是经历所有这些麻烦。大概是这样:

alist = [1,2,3,4,5,6,7]
blist = list()
for item in alist[::-1]:
blist.append(item)
print(blist) #prints [7,6,5,4,3,2,1]

虽然上面的方法可行,但是你使用了额外的内存(【blist】)来存储反转列表。如果列表中的元素数量很大,这可能是一个严重的问题。这就是原地反转派上用场的时候了。就地反转的效率是 O(n ),因为我们至少访问列表中的所有元素一次。

结论

这是一个非常常见的面试问题。试着用同样的方法来解决这些难题,并在下面评论:

  1. 反串“你好”。输出应为“olleh”
  2. 把“我爱 Python Central”这句话倒过来。输出应该是“中央 Python love I”
  3. 检查“madam”是否是回文

我们将在未来的教程中使用这个概念,比如链表反转。本教程到此为止。快乐的蟒蛇!