Python整个反向列表指定索引

时间:2017-03-27 19:10:34

标签: python list

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

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然后反向),但感觉这应该可以在索引系统中使用蟒蛇。我错了吗?

2 个答案:

答案 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] =这将反转所提到索引的值列表。