切片(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

浙公网安备 33010602011771号