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]
  • startend,一个超出左边界一个超出右边界要看 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]
  • startend 都超出了左边界或者都超出了右边界,则为空

    1
    2
    3
    4
    >>> li[-10:-20]
    []
    >>> li[10:20]
    []