如何在Python中反转一个列表

169 阅读4分钟

简介

Python 是一种灵活的语言,通常有几种方法来完成相同的、琐碎的任务。选择一种方法可能取决于时间或空间的复杂性,或者仅仅取决于你的个人偏好。

Python的数据结构相当方便和直观,其内置功能也很容易使用。在这篇文章中,我们将研究如何在 Python 中反转一个列表Python List是一个异质的 (可以包含不同的类型) 类似数组的结构,它存储对内存中对象的引用。

当操作一个列表时,我们可以创建一个_新的、改变了的列表_,或者在_原地_改变原来的列表。我们将在文章中看到这些的不同之处。

使用_reverse()_方法反转一个列表

当涉及到操作数据结构中的数据时,Python 有一个强大的内置方法库。对于反转列表的目的,我们可以利用内置的 **reverse()**方法。

注意: reverse() 方法是_就地_反转列表。_原地_反转一个列表意味着原始列表被改变,而不是创建一个新的、反转的列表。

由于这个原因,我们不能把产生的对象分配给一个新的变量,如果你想在内存中保留原来的列表,你必须在反转之前复制它。

my_list = [1, 2, 3, 4]
my_list.reverse()
print(my_list) # Output: [4, 3, 2, 1]

new_list = my_list.reverse()
print(new_list) # Output: None

没有返回值 - 列表被就地反转。然而,我们可以在反转前将其copy()

list_1 = [1, 2, 3, 4]
list_2 = list_1.copy()

list_1.reverse()

print('Reversed list: ', list_1)
print('Saved original list: ', list_2)

这样做的结果是

Reversed list:  [4, 3, 2, 1]
Saved original list:  [1, 2, 3, 4]

使用片状_符号_反转一个列表

切_片符号_允许我们在 Python 中对各种集合或基于集合的对象的部分进行切片和复制,例如 列表, 字符串, 图元NumPy数组.

当你_切分_一个列表时,从该列表中返回一部分,每一个step的元素都包括在内。

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

# list[start:end:step]
segment_1 = my_list[1:5:1]
segment_2 = my_list[1:5:2]

print(segment_1)
print(segment_2)

这就导致了。

[2, 3, 4, 5]
[2, 4]

通过省略startend 参数,你可以包括_整个_集合。通过设置step 为负数,你可以_反向遍历集合_。当然,如果你把这些东西放在一起。

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

reversed_list = original_list[::-1]
print('Original list: ', original_list)
print('Reversed list: ', reversed_list)

这就导致了。

Original list:  [1, 2, 3, 4, 5, 6]
Reversed list:  [6, 5, 4, 3, 2, 1]

_Slice Notation_完全不影响原始列表,所以original_list ,即使在操作之后也保持不变。

使用_slice()_方法反转一个列表

slice() 方法接受相同的参数 -start,endstep, 并执行与 Slice Notation 相同的操作。不过,你可以在None ,而不是省略startend 参数。

它的返回类型是一个Slice 对象,然后它可以被用来_根据集合的内容进行切片_。它不是在你要切分的集合上被调用的--你在创建后传入Slice 对象,允许你为许多不同的集合创建一个可重复使用和可调用的对象。

它在内部被转换为Slice Notation,所以最终的结果是一样的。

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

slice_obj = slice(None, None, -1)

print('slice_obj type:', type(slice_obj))
print('Reversed list:', original_list[slice_obj])

这就导致了。

slice_obj type: <class 'slice'>
Reversed list: [6, 5, 4, 3, 2, 1]

使用_For Loop_反转一个列表

根据我们是否要保持原始列表的完整性,我们可以从原始列表中pop() 元素并将它们添加到一个新的列表中,或者我们可以直接按相反的顺序追加它们。

pop() 从一个集合中删除_最后一个_元素并返回。我们可以将append() 方法与之结合,直接将删除的元素追加到一个新的列表中,有效地产生一个反向的列表。

original_list = [1, 2, 3, 4] 
reversed_list = []

for i in range(len(original_list)):
    reversed_list.append(original_list.pop())

print(reversed_list) # Output: [4, 3, 2, 1]

另外,我们也可以_反向_遍历列表,直到第-1个索引(不包括在内),然后沿着这个列表添加我们看到的每个元素。range() 方法接受 3 个参数 -start,endstep ,这些参数的使用方法与之前的基本相同。

original_list = [1, 2, 3, 4]
reversed_list = []

for i in range(len(original_list)-1, -1, -1):
    reversed_list.append(original_list[i])

print(reversed_list) # Output: [4, 3, 2, 1]

使用_reversed()_方法反转一个列表

由于用负数步长进行迭代,然后访问原始列表中的每个元素有点冗长,所以添加了reversed() 方法,这使得手动实现反转逻辑变得更加容易,如果你想在上面添加自己的扭曲。

reversed() 方法返回一个迭代器,以反转的顺序迭代集合--我们可以很容易地将这些元素添加到一个新的列表中。

original_list = [1, 2, 3, 4]
new_list = []

for i in reversed(original_list):
	new_list.append(i)
    
print(new_list) # Output: [4, 3, 2, 1]
print(original_list) # Output: [1, 2, 3, 4] --> Original hasn't changed

结论

根据你是否需要一个新的反转列表,一个原地反转的列表,以及你是否想让逻辑为你处理,或者你想在反转过程中灵活地增加额外的操作或扭曲--有几种方法可以在 Python 中反转一个列表。

在本教程中,我们已经介绍了这些情况,强调了每种情况的区别。