简介
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]
通过省略start
和end
参数,你可以包括_整个_集合。通过设置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
,end
和step
, 并执行与 Slice Notation 相同的操作。不过,你可以在None
,而不是省略start
和end
参数。
它的返回类型是一个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
,end
和step
,这些参数的使用方法与之前的基本相同。
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 中反转一个列表。
在本教程中,我们已经介绍了这些情况,强调了每种情况的区别。