2013-07-12 89 views
6

我知道a [end:start:-1]以相反的順序對列表進行切片。Python中的反向索引?

例如

a = range(20) 
print a[15:10:-1] # prints [15, ..., 11] 
print a[15:0:-1] # prints [15, ..., 1] 

,但你不能去(在本例中0)的第一要素。看來,-1是一個特殊的價值。

print a[15:-1:-1] # prints [] 

任何想法?

+0

[Python的切片表示法](http://stackoverflow.com/questions/509211/ python-slice-notation) –

+0

這對你也很有趣:'print(list(reversed(range(5))))' –

回答

8

您可以將變量分配給None

>>> a = range(20) 
>>> a[15:None:-1] 
[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
>>> 
+1

這個(使用'None')可能是最好的解決方案,但是請注意,您也可以使用負指標:'a [-5:-21:-1] '讓你得到同樣的片段,包括最後的'a [0]'元素。 – torek

+0

@torek我也考慮過使用負指數,但我認爲這是最好的解決方案,因爲你可以避免額外的分配給'無'(見我的答案)。 –

8

省略結束索引:

print a[15::-1] 
+0

開始和結束實際上是變量。 –

+0

我需要一個特殊的if語句嗎? –

+0

如果你不介意這樣做,你可以在沒有if語句的情況下做兩個步驟:'print a [low:high + 1] [:: - 1]' – Pablo

0

編輯:開始和結束都是變量

我從來沒有意識到這一點,但(稍微哈克)解決方案是:

>>> a = range(5) 
>>> s = 0 
>>> e = 3 
>>> b = a[s:e] 
>>> b.reverse() 
>>> print b 
[2, 1, 0] 
+0

開始和結束是變量 –

0
>>> a 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
>>> print a[:6:-1] 
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7] 
>>> a[7] == a[:6:-1][-1] 
True 
>>> a[1] == a[:0:-1][-1] 
True 

因此,當你在開始標籤中替換一個值時可以看到:e nd:它會從頭到尾給你一個[結束]。

正如你在這裏也看到:

>>> a[0:2:] 
[0, 1] 

-1是在最後一個值:

>>> a[len(a)-1] == a[-1] 
True 
+0

http:/ /stackoverflow.com/a/509295/1031417 – 0x90

0

如果使用負索引你能避免額外的任務,只用你的開始和結束變量:

a = range(20) 
start = 20 
for end in range(21): 
    a[start:-(len(a)+1-end):-1] 
1

在Python2.x,以字符數方面最簡單的辦法也許應該是:

>>> a=range(20) 

>>> a[::-1] 
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 

雖然我想指出,如果使用xrange(),索引不起作用,因爲xrange()爲您提供xrange對象而不是列表。在Python3.x中,range()在Python2.x中執行xrange()的操作,但它也有一個改進,接受索引對象的索引更改。

>>> a = range(20) 
>>> a[::-1] 
range(19, -1, -1) 
>>> b=a[::-1] 
>>> for i in b: 
...  print (i) 
... 
19 
18 
17 
16 
15 
14 
13 
12 
11 
10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0 
>>> 

範圍之間的差值()和x範圍()從源瞭解到:http://pythoncentral.io/how-to-use-pythons-xrange-and-range/ 由作者:喬伊佩恩

+0

呃?這是答案嗎? –

+0

我的直接答案只是[:: - 1]。以下部分是人們可能發現的一些可能的複雜情況,如果他們使用不同版本的python。對此感到抱歉。我是新來的,你認爲我應該刪除非直接回答部分,我應該把它放在哪裏?謝謝! –