比方說,我希望有一個元組的元素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
語句的方法?
比方說,我希望有一個元組的元素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
語句的方法?
一個稍微低效的方式:
>>> x[-2:][::-1]
(4, 3)
>>>
與x[-n:]
你可以得到最後的n
索引和[::-1]
你可以反轉它!
x[2:None:-1]
OP討論了這個問題,並指出需要檢測第一個所需元素的0索引作爲特例 - 我認爲OP正在尋找一個通用的答案,以獲取從m到反轉元組元素n爲任何有效的m和n而不檢查m == 0。 – 2014-09-26 19:29:38
即時編輯答案! – Kasramvd 2014-09-26 19:30:24
可以代替空元素的使用None
x[0:3][::-1]
即相當於:
tuple(reversed(x[0:3]))
我我不確定聯合國的進展如何必要的中間元組得到優化。
這並不有助於你必須單獨測試0的事實。它只會改變if條件中的內容。 – 2014-09-26 19:31:02
@RogerFan:'x [2:無其他dx:-1] – 2014-09-26 19:32:15
@RogerFan我沒有制定規則,對不起。如果您使用變量來指示端點,它仍然很有用。 – 2014-09-26 19:32:31
也許合併與你原來的元組 「反向哨兵」 元組,並標說:
>>> 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 ---
這不太可能被優化掉。這也不太重要。+1爲聰明的解決方案。 – 2014-09-26 19:33:56
對於給定的小例子,我得到'x [2 :: - 1]'比'x [0:3] [:: - 1]'多花了65%的時間。 – 2014-09-26 19:34:05
這工作。感謝@RogerFan測試效率。希望有人有更好的東西,但在這一點上,我打賭這是除了if語句之外的最佳選擇。 – 2014-09-26 19:34:49