Python整个反向列表指定索引

Kew*_*ewl 8 python list

我有一个列表,我想以相反的顺序获取最后几个元素:

lst = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

我可以反转列表lst[::-1]并反转整个列表.但我希望反向列表只能达到某个索引.我可以指定一个索引:

ind = 1
lst[:ind-1:-1]
Run Code Online (Sandbox Code Playgroud)

得到:

[4, 3, 2]
Run Code Online (Sandbox Code Playgroud)

这是指向索引的原始列表,顺序相反.这适用于任何索引> 0.但如果ind为0(意味着应以相反的顺序返回整个列表),这会导致问题:

ind = 0
lst[:ind-1:-1]
Run Code Online (Sandbox Code Playgroud)

收益:

[]
Run Code Online (Sandbox Code Playgroud)

因为我的结局与我的开头(-1)相同.我的预期/期望输出将是[4, 3, 2, 1]

我知道一个简单的解决方法是将一个if语句用于捕获ind为0的情况,或者分两步执行(index然后反向),但感觉这应该可以用Python中的索引系统来实现.我错了吗?

Sha*_*ger 5

None可以明确地提供以指示"结束"(对于否定步骤,"结束"是序列的开始):

lst[:ind - 1 if ind else None:-1]
Run Code Online (Sandbox Code Playgroud)

虽然你确实说过要避免采用两步法,但坦率地说这样做更为简单; 除非你期望切片是巨大的,否则简单的增益值得你可能遭受的任何琐碎的性能损失:

lst[ind:][::-1]
Run Code Online (Sandbox Code Playgroud)

对于记录,在微不足道的微基准测试中,假设每个ind值同样普遍,一步法更快,但差异相当小,除非你list是巨大的.例如,对于你的四个元素list使用ipython的microbenchmarking:

>>> lst = [1, 2, 3, 4]
>>> %%timeit -r5 inds = range(len(lst))
... for ind in inds:
...     lst[:ind-1 if ind else None:-1]
...
1000000 loops, best of 5: 791 ns per loop

>>> %%timeit -r5 inds = range(len(lst))
... for ind in inds:
...     lst[ind:][::-1]
...
1000000 loops, best of 5: 1.1 µs per loop
Run Code Online (Sandbox Code Playgroud)

这个速度较慢,但​​成本仅为300 ns左右.即使lst是len 4000,每个循环的差异为18 vs 35.5 ms; 被授予,这几乎是时间的两倍,但如果它不是性能关键(或列表通常更小),我称之为可接受的,因为它减轻了维护者的负担,阅读"从ind切片到最终,然后反转它"而不是一步切片的结构更复杂.