我有一个列表,我想以相反的顺序获取最后几个元素:
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中的索引系统来实现.我错了吗?
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切片到最终,然后反转它"而不是一步切片的结构更复杂.