python数组的反转可以有好几种方式,基于python语言的强大表现能力和丰富的特性,总结以下几种。
首先给定一个基本数组: d = [1, 2, 3, 4, 5, 6]
1. reversed函数
reversed
是python的内建函数,会将原数组进行反转(但不影响原数组本身的序列),生成一个新的迭代器,然后你再将其具化为数组。
In [5]: new_d = reversed(d)
In [6]: list(new_d)
Out[6]: [6, 5, 4, 3, 2, 1]
2. reverse函数
该函数是数组本身支持的一个功能,它对原数组本身进行修改反转,执行完该操作后,原数组的顺序发生逆变。
In [13]: d.reverse()
In [14]: d
Out[14]: [6, 5, 4, 3, 2, 1]
3. 切片
通过切片的方式去生成一个新的数组,原数组本身保持不变。
In [20]: dd = d[::-1]
In [21]: dd
Out[21]: [6, 5, 4, 3, 2, 1]
4. 自己实现
这种方式在于有些算法要求需要自己实现,不借助语言本身提供的便捷函数。
4.1 原地交换
这种方式在于基于数组本身修改,利用交换原则,原地交换数组各元素,空间复杂度O(1)。
def reverse(d: list):
d_len = len(d)
half_d = d_len // 2
for i in range(half_d):
d[i], d[d_len - i - 1] = d[d_len - i - 1], d[i]
In [27]: reverse(d)
In [28]: d
Out[28]: [6, 5, 4, 3, 2, 1]
4.2 倒序遍历
借助新的数组,开辟了新的内存空间,这个在空间复杂度上不满足O(1)。
def reverse_1(d: list):
d_len = len(d)
result = []
for i in range(d_len - 1, -1, -1):
result.append(d[i])
return result
In [34]: res = reverse_1(d)
In [35]: res
Out[35]: [6, 5, 4, 3, 2, 1]
4.3 利用栈的LIFO
其实python的数组也是LIFO的数据类型,这里面压栈的步骤省略,出栈满足我们的要求 - 即从数组尾端出栈,即可实现倒序弹出。
def stack_pop(d: list):
while d:
yield d.pop()
In [37]: d = [1, 2, 3, 4, 5, 6]
In [38]: list(stack_pop(d))
Out[38]: [6, 5, 4, 3, 2, 1]
以上就是python的几种数组反转的方式,希望对需要的人有帮助。