python的间隔切片技巧

2020年5月16日 / 58次阅读 / Last Modified 2020年7月3日
语法

python的切片(slice)技术是相当纯熟好用的,sequence(序列)对象都可以直接切片,list,字符串,tuple,bytes...

切片的基本操作,就是讲sequence对象的一部分切下来:

>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s
'123456789'
>>> t
(1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> a[2:7]
[3, 4, 5, 6, 7]
>>> s[2:7]
'34567'
>>> t[2:7]
(3, 4, 5, 6, 7)

从index=2开始,到index=7,但是不取index=7这个位置!7-2=切下来的长度!

我尝试了一下,切片操作还能反过来,用负数index:

>>> a[-2:-7]
[]
>>> a[-2:7]
[]
>>> a[-2:]
[8, 9]
>>> a[-2:9]
[8, 9]
>>> b = [1,2,3,4,5,6,7,8]
>>> b
[1, 2, 3, 4, 5, 6, 7, 8]
>>> b[-7:-2]
[2, 3, 4, 5, 6]
>>> b[-7:-2:2]
[2, 4, 6]

间隔切片开始了,下面是每两个元素取一个:

>>> a[::2]
[1, 3, 5, 7, 9]
>>> s[::2]
'13579'
>>> t[::2]
(1, 3, 5, 7, 9)
>>>
>>> a[3::2]
[4, 6, 8]
>>> s[3::2]
'468'
>>> t[3::2]
(4, 6, 8)
>>>
>>> a[3:7:2]
[4, 6]
>>> s[3:7:2]
'46'
>>> t[3:7:2]
(4, 6)

最后那个数字2,表示步长,即每走2步干一票。当然可以自己修改这个数字了。用步长可以从右到做,即反过来走。

>>> a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> s[::-1]
'987654321'
>>> t[::-1]
(9, 8, 7, 6, 5, 4, 3, 2, 1)
>>>
>>> a[::-2]
[9, 7, 5, 3, 1]
>>> s[::-2]
'97531'
>>> t[::-2]
(9, 7, 5, 3, 1)
>>>
>>> a[3::-2]
[4, 2]
>>> s[3::-2]
'42'
>>> t[3::-2]
(4, 2)

现在可以反过来,从右到左切片了:

>>> a[100:2:-1]
[9, 8, 7, 6, 5, 4]
>>> s[100:2:-1]
'987654'
>>> t[100:2:-1]
(9, 8, 7, 6, 5, 4)

注意index=100,是合法的,只要index比最大的大,都是取最后的那个元素!

关键是切片操作的步长,这个参数的要义一定要get到。

-- EOF --

本文链接:https://www.pynote.net/archives/1944

留言区

《python的间隔切片技巧》有5条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    index中的,和...是numpy的语法,请注意! [回复]

  • 麦新杰

    a[2:7]的解读:从index=2(position=3)开始,到position=7。positon=7,就是index=6,7-2=5,刚好是长度。 [回复]

  • 麦新杰

    切片操作不会出现index out of range的错误,最多的就是切出来一个空的对象! [回复]

    • 麦新杰

      这个细节使得python常常能够写入smell good的代码,更像数学公式的代码。 [回复]

  • 麦新杰

    切片的步长默认是1,整数就从左向右,负数就从右向左,如果与启止index冲突,就返回空。 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top