我有一个列表,我希望以相反的顺序获取最后几个元素:
lst = [1,2,3,4]
我可以使用lst[::-1]
反转列表并反转整个列表。但我希望反向列表只能达到某个索引。我可以指定一个索引:
ind = 1
lst[:ind-1:-1]
并获得:
[4, 3, 2]
是指向索引的原始列表,顺序相反。这适用于任何索引> 0.但如果ind为0(意味着整个列表应以相反的顺序返回),则会导致问题:
ind = 0
lst[:ind-1:-1]
返回:
[]
因为我的结局与我的开头(-1)相同。我的预期/期望输出为[4, 3, 2, 1]
我知道一个简单的解决方法就是只使用if语句来捕获ind为0的情况,或者分两步执行(index然后反向),但感觉这应该可以在索引系统中使用蟒蛇。我错了吗?
答案 0 :(得分:5)
None
can be explicitly provided to indicate "to end"(对于否定步骤,"结束"是序列的开头):
lst[:ind - 1 if ind else None:-1]
虽然你确实说过要避免采用两步法,但坦率地说这样做更为简单;除非你期望切片是巨大的,否则简单的增益值得你可能遭受的任何琐碎的性能损失:
lst[ind:][::-1]
对于记录,在微不足道的微基准测试中,假设每个ind
值同样常见,一步法更快,但差异相当小,除非list
很大。例如,对于使用list
进行微基准测试的四个元素ipython
:
>>> 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
速度较慢,但成本仅为300 ns左右。即使lst
为len 4000,每个循环的差异为18 vs 35.5 ms;被授予,这几乎是时间的两倍,但如果它不是性能关键(或者列表通常更小),我称之为可接受的,因为它减轻了维护者的负担以便阅读&#34 ;从ind切片到最终,然后反转它"而不是一步切片的更复杂的结构。
答案 1 :(得分:0)
使用简便的技术
ind = 1
lst [:ind:-1] =这将反转所提到索引的值列表。