在原地反转一个数组的片[重复]

问题描述 投票:3回答:2

这个问题在这里已有答案:

什么是最好的(最快/最pythonic)方法来就地反转阵列的一部分?

EG,

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]

那么,正确的道路是什么?

python arrays python-3.x reverse in-place
2个回答
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.2倍-1.5倍。


0
投票

[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]
© www.soinside.com 2019 - 2024. All rights reserved.