就地反转数组的一部分
Reverse a slice of an array in-place
什么是最好的 (fastest/most pythonic) 方法来反转数组的 part in-place?
例如,
def reverse_loop(l,a,b):
while a < b:
l[a],l[b] = l[b],l[a]
a += 1
b -= 1
现在之后
l = list(range(10))
reverse_loop(l,2,6)
l
是 [0, 1, 6, 5, 4, 3, 2, 7, 8, 9]
所需的。
唉,在Python中循环效率很低,所以需要一个更好的方法,e.g.,
def reverse_slice(l,a,b):
l[a:b+1] = l[b:a-1:-1]
和 reverse_slice(l,2,6)
将 l
恢复为其原始值。
唉,这对边界情况不起作用:reverse_slice(l,0,6)
将 l
截断为 [7, 8, 9]
因为 l[a:-1:-1]
应该是 l[a::-1]
.
那么,什么是正确的方法?
这个怎么样?
def reverse_slice(l, a, b):
l[a:b] = l[a:b][::-1]
l = list(range(10))
reverse_slice(l, 0, 6) # excludes l[6]
print(l)
输出:
[5, 4, 3, 2, 1, 0, 6, 7, 8, 9]
内置函数的替代方案reversed
:
def reverse_func(l, a, b):
l[a:b] = reversed(l[a:b])
在我的测试中,切片比使用 reversed
快 1.2x-1.5x。
[6::-1]
可以写成[6:None:-1]
:
def reverse_slice(l,a,b):
a1 = None if a==0 else a-1
l[a:b+1] = l[b:a1:-1]
In [164]: y=x.copy(); reverse_slice(y,1,6);y
Out[164]: [0, 6, 5, 4, 3, 2, 1, 7, 8, 9]
In [165]: y=x.copy(); reverse_slice(y,0,6);y
Out[165]: [6, 5, 4, 3, 2, 1, 0, 7, 8, 9]
什么是最好的 (fastest/most pythonic) 方法来反转数组的 part in-place?
例如,
def reverse_loop(l,a,b):
while a < b:
l[a],l[b] = l[b],l[a]
a += 1
b -= 1
现在之后
l = list(range(10))
reverse_loop(l,2,6)
l
是 [0, 1, 6, 5, 4, 3, 2, 7, 8, 9]
所需的。
唉,在Python中循环效率很低,所以需要一个更好的方法,e.g.,
def reverse_slice(l,a,b):
l[a:b+1] = l[b:a-1:-1]
和 reverse_slice(l,2,6)
将 l
恢复为其原始值。
唉,这对边界情况不起作用:reverse_slice(l,0,6)
将 l
截断为 [7, 8, 9]
因为 l[a:-1:-1]
应该是 l[a::-1]
.
那么,什么是正确的方法?
这个怎么样?
def reverse_slice(l, a, b):
l[a:b] = l[a:b][::-1]
l = list(range(10))
reverse_slice(l, 0, 6) # excludes l[6]
print(l)
输出:
[5, 4, 3, 2, 1, 0, 6, 7, 8, 9]
内置函数的替代方案reversed
:
def reverse_func(l, a, b):
l[a:b] = reversed(l[a:b])
在我的测试中,切片比使用 reversed
快 1.2x-1.5x。
[6::-1]
可以写成[6:None:-1]
:
def reverse_slice(l,a,b):
a1 = None if a==0 else a-1
l[a:b+1] = l[b:a1:-1]
In [164]: y=x.copy(); reverse_slice(y,1,6);y
Out[164]: [0, 6, 5, 4, 3, 2, 1, 7, 8, 9]
In [165]: y=x.copy(); reverse_slice(y,0,6);y
Out[165]: [6, 5, 4, 3, 2, 1, 0, 7, 8, 9]