2014-09-26 147 views
3

比方說,我希望有一個元組的元素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語句的方法?

回答

3

一個稍微低效的方式:

>>> x[-2:][::-1] 
(4, 3) 
>>> 
+0

這不太可能被優化掉。這也不太重要。+1爲聰明的解決方案。 – 2014-09-26 19:33:56

+0

對於給定的小例子,我得到'x [2 :: - 1]'比'x [0:3] [:: - 1]'多花了65%的時間。 – 2014-09-26 19:34:05

+0

這工作。感謝@RogerFan測試效率。希望有人有更好的東西,但在這一點上,我打賭這是除了if語句之外的最佳選擇。 – 2014-09-26 19:34:49

0

x[-n:]你可以得到最後的n索引和[::-1]你可以反轉它!

x[2:None:-1] 
+2

OP討論了這個問題,並指出需要檢測第一個所需元素的0索引作爲特例 - 我認爲OP正在尋找一個通用的答案,以獲取從m到反轉元組元素n爲任何有效的m和n而不檢查m == 0。 – 2014-09-26 19:29:38

+0

即時編輯答案! – Kasramvd 2014-09-26 19:30:24

2

可以代替空元素的使用None

x[0:3][::-1] 

即相當於:

tuple(reversed(x[0:3])) 

我我不確定聯合國的進展如何必要的中間元組得到優化。

+1

這並不有助於你必須單獨測試0的事實。它只會改變if條件中的內容。 – 2014-09-26 19:31:02

+1

@RogerFan:'x [2:無其他dx:-1] – 2014-09-26 19:32:15

+0

@RogerFan我沒有制定規則,對不起。如果您使用變量來指示端點,它仍然很有用。 – 2014-09-26 19:32:31

0

也許合併與你原來的元組 「反向哨兵」 元組,並標說:

>>> x = (0, 1, 2, 3) 
>>> y = (0,) 

然後:

>>> (y + x)[3:0:-1] 
(2, 1, 0) 
>>> (y + x)[2:0:-1] 
(1, 0) 

速度比不上彼得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 --- 
相關問題