16

我知道a[end:start:-1]以相反的顺序对列表进行切片。

例如

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 []  

有任何想法吗?

4

6 回答 6

18

您可以将变量分配给None

>>> a = range(20)
>>> a[15:None:-1]
[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> 
于 2013-07-12T08:13:59.963 回答
14

省略结束索引:

print a[15::-1]
于 2013-07-12T07:53:30.687 回答
5

在 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 对象而不是列表。

>>> a=xrange(20)
>>> a[::-1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'

在 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
>>> 

range() 和 xrange() 之间的区别来自源:http ://pythoncentral.io/how-to-use-pythons-xrange-and-range/ 作者:Joey Payne

于 2016-07-19T03:41:49.997 回答
1
>>> 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

因此,当您在开始标签中替换一个值时可以看到:结束:它会从开始到结束专门为您提供 [结束]。

正如您在这里所看到的:

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

-1 是 a 中的最后一个值:

>>> a[len(a)-1] == a[-1]
True
于 2013-07-12T08:09:01.387 回答
0

编辑:开始和结束是变量

我从来没有意识到这一点,但一个(有点hacky)的解决方案是:

>>> a = range(5)
>>> s = 0
>>> e = 3
>>> b = a[s:e]
>>> b.reverse()
>>> print b
[2, 1, 0]
于 2013-07-12T07:55:00.680 回答
0

如果您使用负索引,您可以避免额外的分配,只使用您的开始和结束变量:

a = range(20)
start = 20
for end in range(21):
    a[start:-(len(a)+1-end):-1]
于 2013-07-12T08:51:56.767 回答