3.8 KiB
Python 中的列表:如何实现就地反转
先决条件
要了解就地列表反转,您应该了解以下内容:
- Python 3
- Python 数据结构-列表
- 交换值
什么是到位列表冲销?
在之前的帖子中,你可能已经学会了如何用 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 | 【1,2,3,4,5,6,7】 | 1 [0] | 7 [6] | 【7,2,3,4,5,6,1】 | | 2 | 【7,2,3,4,5,6,1】 | 2[1] | 6[5] | 【7,6,3,4,5,2,1】 | | 3 | 【7,2,3,4,5,6,1】 | 3[2] | 5【4】 | 【7,6,5,4,3,2,1】 | | 4 | 【7,6,5,4,3,2,1】 | 4【3】 | 4【3】 | 停止自左==右 |
如你所见,现在名单颠倒了。
算法
- 左 指针指向第一个索引 右 指针指向最后一个索引
- 互换元素所指的 左 和 右 指针分别为
- 左指针递增 1,右指针递减 1
- 检查 左> =右 :
- 如果没有,重复步骤 2-4
- 如果是,停止。清单冲销完成
注意: 虽然这个算法是针对列表解释的,但是你也可以把它用在字符串上。在这种情况下,您可能需要通过类型转换将字符串转换为列表。不要忘记从列表格式重新构造字符串。这可以通过使用一些格式化命令来完成,比如 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 ),因为我们至少访问列表中的所有元素一次。
结论
这是一个非常常见的面试问题。试着用同样的方法来解决这些难题,并在下面评论:
- 反串“你好”。输出应为“olleh”
- 把“我爱 Python Central”这句话倒过来。输出应该是“中央 Python love I”
- 检查“madam”是否是回文
我们将在未来的教程中使用这个概念,比如链表反转。本教程到此为止。快乐的蟒蛇!