让我们说我想要一个元组的元素1-3,向后:
x = (0,1,2,3,4)
x[1:4]
返回(1,2,3)
和
x[3:0:-1]
返回(3,2,1)
但如果我想要元素0-2怎么办?
我可以x[2::-1]
获得(2,1,0)
的正确答案,但x[2:0:-1]
返回(2,1)
,x[2:-1:-1]
返回()
。
如果我以不知道的间隔进行切片,是否有办法在不使用if
语句的情况下切换到最后一项?
答案 0 :(得分:3)
一种效率稍低的方式:
x[0:3][::-1]
相当于:
tuple(reversed(x[0:3]))
我不确定那些不必要的中间元组是如何被优化掉的。
答案 1 :(得分:2)
您可以使用None
代替空元素:
x[2:None:-1]
答案 2 :(得分:0)
使用x[-n:]
,您可以获得最后一个n
索引,使用[::-1]
可以反转它!
>>> x[-2:][::-1]
(4, 3)
>>>
答案 3 :(得分:0)
也许合并一个"反向哨兵"使用原始元组进行元组,并下标:
>>> x = (0, 1, 2, 3)
>>> y = (0,)
然后:
>>> (y + x)[3:0:-1]
(2, 1, 0)
>>> (y + x)[2:0:-1]
(1, 0)
不如Peter DeGlopper solution那么快:
#!/usr/bin/env python
import time
x = tuple(range(0,int(1e6)))
y = (0,)
start_time = time.time()
a = (y+x)[3:0:-1]
print("tuple add --- %s seconds ---" % (time.time() - start_time))
start_time = time.time()
b = x[0:3][::-1]
print("tuple rev --- %s seconds ---" % (time.time() - start_time))
甚至没有关闭,真的:
$ ./test61.py
tuple add --- 0.0153260231018 seconds ---
tuple rev --- 6.19888305664e-06 seconds ---