在以下示例中:
foo = ['red', 'white', 'blue', 1, 2, 3]
其中:foo[0:6:1]
将打印foo中的所有元素。但是,foo[6:0:-1]
将省略第一个或第0个元素。
>>> foo[6:0:-1]
[3, 2, 1, 'blue', 'white']
我了解我可以使用foo.reverse()或foo [::-1]反向打印列表,但是我想了解为什么foo [6:0:-1]不能打印整个列表?
在以下示例中:
foo = ['red', 'white', 'blue', 1, 2, 3]
其中:foo[0:6:1]
将打印foo中的所有元素。但是,foo[6:0:-1]
将省略第一个或第0个元素。
>>> foo[6:0:-1]
[3, 2, 1, 'blue', 'white']
我了解我可以使用foo.reverse()或foo [::-1]反向打印列表,但是我想了解为什么foo [6:0:-1]不能打印整个列表?
Answers:
切片符号简而言之:
[ <first element to include> : <first element to exclude> : <step> ]
如果要在反转列表时包括第一个元素,则将中间元素留空,如下所示:
foo[::-1]
您还可以在这里找到有关Python切片的一些很好的信息:
解释Python的切片符号
[ <first element to include> : <first element to exclude> : <step> ]
是我见过的slice语法的最清晰的解释。将其称为“要排除的第一个元素”确实使事情变得显而易见。
<first element to include>
或<first element to exclude>
从列表-1
的末尾开始索引时,最后一个元素-2
也是如此,倒数第二个元素也是如此,等等。例如,以相反的顺序x[-1:-4:-1]
获取最后三个元素x
。因此,您可以将其解释为“-1
从列表(-1 <first element to include>
)中的最后一个元素向后移动每个元素(步骤),直到但不包括末尾(-4 <first element to include>
)的第四个元素”。
<step>
是-1
),它有助于我思考<first element to include, moving from right to left>
。因此,要n
以相反的顺序从列表中获取“最左侧”的元素:foo[n-1::-1]
。以n
相反的顺序获取“最右边”的元素:foo[-1:-n-1:-1]
。
foo[0]
”?
...为什么foo [6:0:-1]不显示整个列表?
因为中间值是排他性的,而不是包容,停止值。的间隔表示法是[开始,停止)。
这正是[x] range的工作方式:
>>> range(6, 0, -1)
[6, 5, 4, 3, 2, 1]
这些是包含在结果列表中的索引,并且第一项不包括0。
>>> range(6, -1, -1)
[6, 5, 4, 3, 2, 1, 0]
另一种查看方式是:
>>> 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
索引6超出了L的有效索引(准确地说是一次),因此将其从该范围中排除为排除的停止值:
>>> range(0, 6, 1)
[0, 1, 2, 3, 4, 5]
仍会为您提供列表中每个项目的索引。
range
可以做到,但slice不能做到,因为这-1
是最后一个元素。因此l=[1, 2, 3]
,l[2:-1:-1] == []
。
这个答案可能有点过时了,但是对于那些遇到同样问题的人可能会有所帮助。您可以获取具有任意结尾的反向列表-索引最多为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]
使用
>>>foo[::-1]
这会显示从结尾元素到开头的列表的反向显示,
将来自安德鲁-克拉克的答案正式化一点:
假设列表v
和 v[n1:n2:n3]
切片。
n1
是初始位置,n2
是最终位置,n3
是步骤
让我们以Python方式编写一些伪代码:
n3 = 1 if (n3 is missing) else n3
if n3==0:
raise exception # error, undefined step
第一部分:n3正
if n3>0:
slice direction is from left to right, the most common direction
n1 is left slice position in `v`
if n1 is missing:
n1 = 0 # initial position
if n1>=0:
n1 is a normal position
else:
(-n1-1) is the position in the list from right to left
n2 is right slice position in `v`
if n2 is missing:
n2 = len(x) # after final position
if n2>=0:
n2 is a normal final position (exclusive)
else:
-n2-1 é the final position in the list from right to left
(exclusive)
第二部分:n3负
else:
slice direction is from right to left (inverse direction)
n1 is right slice position in `v`
if n1 is missing:
n1 = -1 # final position is last position in the list.
if n1>=0:
n1 is a normal position
else:
(-n1-1) is the position in the list from right to left
n2 is left slice position in `v`
if n2 is missing:
n2 = -len(x)-1 # before 1st character (exclusive)
if n2>=0:
n2 is a normal final position (exclusive)
else:
-n2-1 is the ending position in the list from right to left
(exclusive)
现在的原始问题是:如何使用切片符号反转列表?
L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(L(::-1)) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
为什么?
n1 is missing and n3<0
=> n1=0
n2 is missing and n3<0
=> n2 = -len(x)-1
所以 L(::-1) == L(-1:-11:-1)
foo[7:None:-1]
可能性:)