Python - slice
List Slice: list[start:end:step]
start
,切片的开始位置,包括start
,注意列表是从索引 0 开始的。end
,切片的结束位置,不包括end
。step
,切片的步长。默认为 1。
1 | >>> li = [0, 1, 2, 3, 4, 5] |
start
为空,则默认为 0;end
为空,则默认切片到列表的最后,即len(li) + 1
:1
2
3
4
5
6>>> li[:]
[0, 1, 2, 3, 4, 5]
>>> li[:3]
[0, 1, 2]
>>> li[3:]
[3, 4, 5]step
不能够为 0.1
2
3
4>>> li[::0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: slice step cannot be zero当
step
> 0 时,切片是从从左到右进行的。所以,在没有超出边界时,start
要在end
的左边,否则返回值为空1
2
3
4
5
6
7
8
9
10>>> li[4:0]
[]
>>> li[0:-1]
[0, 1, 2, 3, 4]
>>> li[:-5]
[0]
>>> li[-6:1]
[0]
>>> li[-6:5:2]
[0, 2, 4]当
step
< 0 时,切片是从右到左进行的。所以,在没有超出边界时,start
要在end
的右边,否则返值为空。1
2
3
4
5
6>>> li[0:4:-1]
[]
>>> li[5:0:-1] # exclude end
[5, 4, 3, 2, 1]
>>> li[::-1] # 经典应用:反转字符串
[5, 4, 3, 2, 1, 0]
注意:无论 step
> 0,还是 step
< 0,切片都是包含 start
,而不包含 end
。
边界问题:
start
超出左边界,则从索引 0 开始1
2>>> li[-7:]
[0, 1, 2, 3, 4, 5]end
超出右边界,则切片到最后结束,即len(li)
1
2>>> li[:100]
[0, 1, 2, 3, 4, 5]start
和end
,一个超出左边界一个超出右边界要看step
的值正负来判断1
2
3
4
5
6
7
8>>> li[-10:10]
[0, 1, 2, 3, 4, 5]
>>> li[10:-10]
[]
>>> li[-10:10:-1]
[]
>>> li[10:-10:-1]
[5, 4, 3, 2, 1, 0]start
和end
都超出了左边界或者都超出了右边界,则为空1
2
3
4>>> li[-10:-20]
[]
>>> li[10:20]
[]