首页 文章

反转的数组切片包括第一个元素[重复]

提问于
浏览
3

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

比方说我有:

>>> a = [1, 2, 3, 4]

我希望得到一个相反的切片 . 假设我想要给出 start_idx = 1stop_idx = 0 的第1和第0个元素:

[2, 1]

使用切片表示法:

a[x:y:z]

使用 start_idxstop_idxxyz 使用什么值?

我试过了:

>>> a[start_idx:stop_idx:-1]
[2]
>>> a[start_idx:stop_idx-1:-1]
[]

差异化:

这个问题是关于具有负步骤的切片,其中应包括开始和结束索引元素(如数学中的闭合间隔),并且动态计算切片结束索引 .

Understanding Python's slice notation是关于符号的通用通用问题: xyz 在[x:y:z]中的含义 . 它没有提到逆转案例 .

这个问题与其他标记的重复项不同,因为它处理反向切片开始和结束索引由变量而不是硬编码计算或给出的一般情况 .

2 回答

  • 1

    以下是两种通用解决方案:

    • 采取前向切片然后反转它:
    >>> a[stop_idx:start_idx+1][::-1]
    [2, 1]
    
    • 基于this answer,使用负步骤并在第一个元素(加上停止偏移)之前停止1个元素:
    >>> a[start_idx:stop_idx-len(a)-1:-1]
    [2, 1]
    

    比较执行时间,第一个版本更快:

    >>> timeit.timeit('foo[stop_idx:start_idx+1][::-1]', setup='foo="012345"; stop_idx=0; start_idx=3', number=10_000_000)
    1.7157553750148509
    >>> timeit.timeit('foo[start_idx:stop_idx-len(foo)-1:-1]', setup='foo="012345"; stop_idx=0; start_idx=3', number=10_000_000)
    1.9317215870250948
    
  • 3

    如果希望反转间隔在索引0处结束,则可以在切片时省略第二个索引 .

    a = [1, 2, 3, 4]
    a[1::-1] # [2, 1]
    

    通常,只要您的最终索引为零,您希望将其替换为 None ,否则您希望减少它 .

    由于索引算法,我们必须分别处理这些情况以与通常的切片行为一致 . 这可以用三元表达巧妙地完成 .

    def reversed_interval(lst, i=None, j=None):
        return lst[j:i - 1 if i else None:-1]
    
    reversed_interval([1, 2, 3, 4], 0, 1) # [2, 1]
    

相关问题