切片(Slice)

切片的基本操作

取一个list、tuple、strings的部分元素我们经常遇到的操作,我们经常用的一种切片(slice)方法

用法

seq[start:stop:step]:start为起始索引(包含),stop为结束索引(不包含),step为步长,省略step的话表示默认值为1,步长可为负数,表示倒叙取元素

start为0石可以省略,stop为len(lst)石可以省略

如果start和stop同时省略,步长为正数,就是从头到尾。步长为负数,就是从尾到头

示例

>>> lst = list(range(0, 20))    # 创建一个0-20的列表
>>> lst
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> len(lst)
20

>>> lst[0:8]    # 切片范围0-8,包含0,不包含8
[0, 1, 2, 3, 4, 5, 6, 7]
>>> lst[:8]    # 省略start,效果同上
>>> lst[8:]    # 省略stop,直接到len(lst)
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> lst[12:-1]    # stop为-1表示最后一个元素
[12, 13, 14, 15, 16, 17, 18]
>>> lst[12:-5]
[12, 13, 14]
>>> lst[-7:-1]    # start为-7表示从倒数第七个元素开始
[13, 14, 15, 16, 17, 18]
>>> lst[-28:12]    # start超出索引范围从0开始
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> lst[12:28]    # stop超出索引范围到len(lst)结束
[12, 13, 14, 15, 16, 17, 18, 19]
>>> lst[12:3]    # 从左往右切片,所以start要小于stop。如果start大于stop,将得到一个空列表
[]

>>> lst[0:10:2]    # 步长为2,表示每隔2个取一次元素
[0, 2, 4, 6, 8]
>>> lst[:10:2]    # 省略start,效果同上
[0, 2, 4, 6, 8]
>>> lst[-1:-10:-2]    # start比stop大的时候,step为负数才能取到值,否则取到的为空值
[19, 17, 15, 13, 11]
>>> lst[-1:-10:2]
[]

>>> lst[1::2]    # 省略stop则一直取值到len(lst),步长为2
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
>>> lst[5::2]
[5, 7, 9, 11, 13, 15, 17, 19]
>>> lst[1::3]
[1, 4, 7, 10, 13, 16, 19]

>>> lst[::2]    # 同时省略start和stop
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> lst[::-2]    # 同上,步长变为负数,表示倒叙切片
[19, 17, 15, 13, 11, 9, 7, 5, 3, 1]

>>> lst[:12:2]    # 省略start,step为正,则从0开始取到stop
[0, 2, 4, 6, 8, 10]
>>> lst[:12:-2]    # 省略start,step为负,则从len(lst)开始取到stop
[19, 17, 15, 13]
>>> lst[12::2]    # 省略stop,step为正,则从start取到len(lst)
[12, 14, 16, 18]
>>> lst[12::-2]    # 省略stop,step为负,则从start取到0
[12, 10, 8, 6, 4, 2, 0]

>>> lst[::2][::-1]    # 切片之后在进行反转
[18, 16, 14, 12, 10, 8, 6, 4, 2, 0]
>>> lst[-2::-2]
[18, 16, 14, 12, 10, 8, 6, 4, 2, 0]
>>> lst[-2::]
[18, 19]

对切片赋值

对连续切片赋值,如果所赋值的内容是可迭代的(iterable),会替换切片原来的元素,元素个数可以不相同

对非连续的切片赋值,赋值的元素个数要和切片切出来的元素个数相同

示例

>>> lst = list(range(0,10))
>>> lst[3:5] = ['x', 'y']    # 个数相同情况下
>>> lst
[0, 1, 2, 'x', 'y', 5, 6, 7, 8, 9]

>>> lst = list(range(0,10))
>>> lst[3:5] = ['x', 'y', 'z']    # 付赋值个数比切片多的情况
>>> lst
[0, 1, 2, 'x', 'y', 'z', 5, 6, 7, 8, 9]

>>> lst = list(range(0,10))
>>> lst[3:5] = ['x']    # 赋值个数比切片少的情况
>>> lst
[0, 1, 2, 'x', 5, 6, 7, 8, 9]

>>> lst = list(range(0,10))
>>> lst[3:8:2]
[3, 5, 7]
>>> lst[3:8:2] = ['x']    # 不连续的切片,赋值个数不同会抛出异常
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-68-05d86422e65f> in <module>()
----> 1 lst[3:8:2] = ['x']

ValueError: attempt to assign sequence of size 1 to extended slice of size 3

>>> lst[3:8:2] = ['x', 'y', 'z']    # 不连续的切片,赋值个数相同能赋值上
>>> lst
[0, 1, 2, 'x', 4, 'y', 6, 'z', 8, 9]

成员操作符in和not in

可以用在列表、元组、字符串、字典、元组等

>>> lst = list(range(0,10))

>>> 3 in lst
True

>>> 10 in lst
False

>>> 10 not in lst
True
posted @ 2020-11-25 22:50  一墨无辰  阅读(599)  评论(0)    收藏  举报