2013-07-12 59 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。对此感到抱歉。我是新来的,你认为我应该删除非直接回答部分,我应该把它放在哪里?谢谢! –