使用切片表示法反转列表

use*_*079 62 python syntax list slice

在以下示例中:

foo = ['red', 'white', 'blue', 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

其中:foo[0:6:1]将打印foo中的所有元素.但是,foo[6:0:-1]将省略第1或第0个元素.

>>> foo[6:0:-1]
[3, 2, 1, 'blue', 'white']
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用foo.reverse()或foo [:: - 1]反向打印列表,但我试图理解为什么foo [6:0:-1]不打印整个列表?

And*_*ark 118

切片符号简称:

[ <first element to include> : <first element to exclude> : <step> ]
Run Code Online (Sandbox Code Playgroud)

如果要在反转列表时包含第一个元素,请将中间元素保留为空,如下所示:

foo[::-1]
Run Code Online (Sandbox Code Playgroud)

您还可以在这里找到有关Python切片的一些很好的信息:
解释Python的切片表示法

  • 这个:`[<要包括的第一个元素:<第一个要排除的元素>:<步骤>]`是我看过的切片语法的最清楚的解释.将其称为"排除的第一要素"确实使得它显而易见. (30认同)
  • 当你使用负索引作为`<要包含的第一个元素>`或`<要排除的第一个元素>时,它从列表的后面开始索引,所以`-1`是最后一个元素,`-2`是因此,例如,`x [-1:-4:-1]`将以相反的顺序得到`x`的最后三个元素.所以你可能会把它解释为"向后移动从列表中的最后一个元素(`-1 <第一个元素包括>`)向上移动每个元素(`-1`步骤),直到但不包括结尾的第四个元素( `-4 <要包括的第一个元素>`)". (3认同)

Cap*_*ton 9

如果您在记住切片表示法时遇到问题,可以尝试使用Hokey Cokey:

[ In:Out:震撼一切 ]

[第一元件 CLUDE:第一元件离开:该步骤使用]

因人而异


fok*_*oki 8

这是一个非常好的问题,在我看来,上述答案都没有真正回答所提出的问题。部分原因是,一个理智上诚实的答案可能会揭示 Python 类型系统的弱点。其他一些语言也存在同样的弱点。

一个更理智诚实的答案可能是: Python 切片不能很好地概括。

准确地说,可以用collection[begin:end]collection[end:begin:-1]不工作的方式沿一个方向遍历集合。它不起作用,因为第一个索引是0,但“第一个索引之前的索引”不是-1。因此,它collection[end:-1:-1]的评估结果并不符合我们的合理预期。

这个[first to include : first to exclude : step]解释是有缺陷的。如果“第一个排除”是第一个元素之前的元素,则您无法以与想要包含相同第一个元素的情况相同的方式表达它。

总之,你并没有疯狂地期望通用性,它只是不存在。


Fre*_*urk 6

...为什么foo [6:0:-1]不打印整个列表?

因为中间值是独占的,而不是包容性的停止值.的间隔表示法是[开始,停止).

这正是[x]范围的工作原理:

>>> range(6, 0, -1)
[6, 5, 4, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

这些是包含在结果列表中的索引,并且它们不包括第一个项目的0.

>>> range(6, -1, -1)
[6, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

另一种看待它的方法是:

>>> L = ['red', 'white', 'blue', 1, 2, 3]
>>> L[0:6:1]
['red', 'white', 'blue', 1, 2, 3]
>>> len(L)
6
>>> L[5]
3
>>> L[6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

索引6超出(一次,精确地)L的有效索引,因此将其从范围中排除为排除的停止值:

>>> range(0, 6, 1)
[0, 1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

仍然为列表中的每个项目提供索引.


小智 6

这个答案可能有点过时,但它可能对遇到同样问题的人有所帮助。您可以获得具有任意结尾的反向列表 - 最多为 0 索引,应用第二个就地切片,如下所示:

>>> L = list(range(10))
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (start_ex, end) = (7, 0)
>>> L[end:start_ex][::-1]
[6, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

  • 这实际上非常有用,因为您可以对所有情况使用相同的语法。您不必将 0 视为特殊情况。 (2认同)