当前位置 博文首页 > zy010101博客:Python——分片的强大功能
从某一个位置开始进行切片,到整个序列结束。例如:
>>> l[1:] # 不用写结束位置即可。
[2, 3]
超出边界的索引会出错,但是分片不会,因为python会调整分片的边界来适应。例如:
>>> l[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> l[-10:50]
[1, 2, 3]
以翻转的方式提取分片是不可行的,这样得到的分片永远是空,因为python会缩放分片边界值,以确保较低边界永远不会大于较高边界。即:l[2:1]相当于是l[2:2],故取到的分片是空。例如:
>>> l[2:1]
[]
>>> l[5:2]
[]
索引赋值和c语言等是类似的,用一个新对象取代索引处原来的对象。只不过python可以用任意数据类型来进行赋值。
分片赋值有一些不同,它能够将整个片段给替换掉。注意,分片赋值的应当是一个可迭代对象,即使分片大小是1。 例如:
>>> l = [1,2,3]
>>> l[1:2] = 4 # 错误赋值
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>> l[1:2] = [4] # 插入一个值
>>> l
[1, 4, 3]
>>> l[0:1] = [0,0,0] # 插入多个值
>>> l
[0, 0, 0, 4, 3]
如果不太好理解分片赋值是如何将整个片段给替换掉的。可以分成两步来理解。
这样有助于理解可以插入多个元素,但是实际情况并非如此。
以l[:0],l[1:1],l[2:2]等这样的方式取到的分片是空的。例如:
>>> l = [1,2,3]
>>> l[:0]
[]
>>> l[1:1]
[]
>>> l[2:2]
[]
即使是空分片,也是会进行替换的,例如:
>>> l = [1,2,3]
>>> l[1:1]
[]
>>> l[1:1] = [0,0,0] # 替换索引1处的内容
>>> l
[1, 0, 0, 0, 2, 3]
如果,我们给分片赋值的是空,将会删除分片(将原来的替换为空,实际效果和删除一样)。例如:
>>> l
[1, 0, 0, 0, 2, 3]
>>> l[1:4] = []
>>> l
[1, 2, 3]
分片还可以在指定位置插入元素,例如:
>>> L=[1,2,3]
>>> L[0:0] = [0] # 在索引0处插入0
>>> L
[0, 1, 2, 3]
>>> L[1:1] = ['X'] # 在索引1处插入X
>>> L
[0, 'X', 1, 2, 3]
所以,分片操作是相当强大的,它的实际效果可以体现为替换,插入,删除。但是这种操作方式过于“黑客化”,它不是python中常见的操作方式。python提供了更加友好的工具来实现相关操作,例如:append(),pop(),remove(),insert()等方法。
>>> L = [1,2,3]
>>> L[len(L):] = [4] # 在尾部追加元素(可以是任意个元素,这点比append强大)
>>> L
[1, 2, 3, 4]
>>> L.append(5)
>>> L
[1, 2, 3, 4, 5]
>>> L[len(L):] = [6,7,8] # 追加多个元素
>>> L
[1, 2, 3, 4, 5, 6, 7, 8]
>>> L[1:1] = ['1'] # 在位置1处插入值'1'
>>> L
[1, '1', 2, 3, 4, 5]
>>> L.insert(2,'2') # 在位置2处插入值'2'
>>> L
[1, '1', '2', 2, 3, 4, 5]
>>> L[0:0] = ['0','0','0'] # 在0处插入多个元素。
>>> L
['0', '0', '0', 1, '1', '2', 2, 3, 4, 5]
>>> L
[1, '1', '2', 2, 3, 4, 5]
>>> L[1:2] = [] # 删除位置1处的元素
>>> L
[1, '2', 2, 3, 4, 5]
>>> L.pop(1) # 删除位置1处的元素
'2'
>>> L
[1, 2, 3, 4, 5]
>>> L[-1:] = [] # 删除末尾的值
>>> L
[1, 2, 3, 4]
>>> L[0:2] = [] # 删除0:2(0,1两个位置处的值)
>>> L
[3, 4]
pop()方法能够返回被删除的值,而使用切片删除并不能。
>>> L = [1,2,3,4]
>>> L[2:3] = ['3'] # 修改位置2处的值
>>> L
[1, 2, '3', 4]
>>> L[0:2] = ['1','2'] # 修改多个位置处的值
>>> L
['1', '2', '3', 4]
实际上还可以在修改的同时插入值,但是一般不会这么做。例如:
>>> L[3:] = [‘4’,‘5’,‘6’]
>>> L
[‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’]
>>> L[-1:] # 查找最后一个元素
['6']
>>> L[0:1] # 查找第0个元素
['1']
>>> L[0:3] # 查找0,1,2三个元素
['1', '2', '3']
>>> L[3:1] # 注意,不能逆序查找。逆序查找的结果是空。
[]