向后切片组 - 如何处理第一个元素?

时间:2014-09-26 19:24:54

标签: python

让我们说我想要一个元组的元素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语句的情况下切换到最后一项?

4 个答案:

答案 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 ---