Python-Slicing

2022-11-12

初学 python ,记录一下自己对 slicing 操作的理解。

1
2
# 这里以 string 为例,当然,slicing 还支持 list,tuple。
str = 'porum'

关于 index:

在 python 中,index 可以是负数,-1 表示最后一个元素,-2 表示倒数第二个元素,以此类推。

1
2
3
4
5
+---+---+---+---+---+
| p | o | r | u | m |
+---+---+---+---+---+
0 1 2 3 4
-5 -4 -3 -2 -1
1
2
3
4
5
# index 4和-1对应的都是'm'
>>> str[4]
'm'
>>> str[-1]
'm'

关于 slicing:

  • str[from:to] # 返回 [from,to) 的内容

    1
    2
    3
    # 返回区间 [0,2) 的值
    >>> str[0:2]
    'po'
  • str[from:] # 等价于 str[from:None],返回 [from,len) 的内容

    1
    2
    3
    # 返回区间 [2,末尾] 的值
    >>> str[2:]
    'rum'
  • str[:to] # 等价于 str[None:to],返回 [0,to) 的内容

    1
    2
    3
    # 返回区间 [从头,2) 的值
    >>> str[:2]
    'po'
  • str[:] # 返回 [None, None) 的内容,其实就是 copy 一份

    1
    2
    3
    # 返回 str 的拷贝
    >>> str[:]
    'porum'
  • str[from:to:step] # 表示从 from 开始取值,步长为 step,直到 to。同上,这里的 from to 为左闭右开区间,也均可省略。step 可正可负,但不可以是0。正数表示正序遍历,负数表示倒序遍历。

    1
    2
    3
    4
    5
    # 
    >>> str[::2]
    'prm'
    >>> str[0:4:2]
    'pr'
  • 再举一个 step 为负数的例子

    1
    2
    3
    # 反转 porum
    >>> str[::-1]
    'murop'

我们再看下面的例子:

1
2
3
# [:1:-1] 等价于 [None:1:-1],因为 step 为负数,所以可以理解为是倒序取值,取到 index 为1的位置(exclude),因为 from 为 None,可以理解为从尾部开始。
>>> str[:1:-1]
'mur'
1
2
3
4
5
     +---+---+---+---+---+
| p | o | r | u | m |
+---+---+---+---+---+
None 0 1 2 3 4 None
<-----------------
1
2
3
# [2::-1] 等价于 [2:None:-1],从 index 为2的位置(include)倒序取值,一直到头部。
>>> 'porum'[2::-1]
'rop'
1
2
3
4
5
     +---+---+---+---+---+
| p | o | r | u | m |
+---+---+---+---+---+
None 0 1 2 3 4 None
<-------------

反转操作我们还可以这样写:

1
2
3
4
5
# 只要满足 from >= len-1, to < -len,都等价于 [::-1]
>>> str[4:-6:-1]
'murop'
>>> 'porum'[100:-100:-1]
'murop'
1
2
3
4
5
6
       +---+---+---+---+---+
| p | o | r | u | m |
+---+---+---+---+---+
0 1 2 3 4 5 6
-7 -6 -5 -4 -3 -2 -1
<--------------------