切片也是Python序列的重要操作之一,除了适用于列表之外,还适用于元组、字符串、range对象,但列表的切片操作具有最强大的功能。不仅可以使用切片来截取列表中的任何部分返回得到原列表的一个浅复制,也可以通过切片来修改和删除列表中部分元素,甚至可以通过切片操作为列表对象增加元素。
在形式上,切片使用2个冒号分隔的3个数字来完成,例如:
[start:end:step]
其中,第一个数字start表示切片开始位置,默认为0;第二个数字end表示切片截止(但不包含)位置(默认为列表长度);第三个数字step表示切片的步长(默认为1)。当start为0时可以省略,当end为列表长度时可以省略,当step为1时可以省略,并且省略步长时可以同时省略最后一个冒号。另外,当step为负整数时,表示反向切片,这时start应该比end的值要大才行。
(1)使用切片获取列表部分元素
使用切片可以返回列表中部分元素组成的新列表。与使用索引作为下标访问列表元素的方法不同,切片操作不会因为下标越界而抛出异常,而是简单地在列表尾部截断或者返回一个空列表,代码具有更强的健壮性。
>>> aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>> aList[::] #返回包含原列表中所有元素的新列表
[3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>> aList[::-1] #返回包含原列表中所有元素的逆序列表
[17, 15, 13, 11, 9, 7, 6, 5, 4, 3]
>>> aList[::2] #隔一个取一个,获取偶数位置的元素
[3, 5, 7, 11, 15]
>>> aList[1::2] #隔一个取一个,获取奇数位置的元素
[4, 6, 9, 13, 17]
>>> aList[3:6] #指定切片的开始和结束位置
[6, 7, 9]
>>> aList[0:100] #切片结束位置大于列表长度时,从列表尾部截断
[3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>> aList[100:] #切片开始位置大于列表长度时,返回空列表
[]
>>> aList[100] #抛出异常,不允许越界访问
IndexError: list index out of range
(2)使用切片为列表元素进行增加或插入元素
可以使用切片操作为列表插入新元素,并且不影响列表对象的内存地址。
>>> aList[len(aList):]
[]
>>> aList[len(aList):] = [9] #在列表尾部增加元素
>>> aList
[3, 5, 7, 9]
>>> aList[:0] = [1, 2] #在列表头部插入元素
>>> aList
[1, 2, 3, 5, 7, 9]
>>> aList[3:3] = [4] #在列表中间位置插入元素
>>> aList
[1, 2, 3, 4, 5, 7, 9]
(3)使用切片替换和修改列表中的元素
>>> aList = [3, 5, 7, 9]
>>> aList[:3] = [1, 2, 3] #替换列表元素,等号两边的列表长度相等
>>> aList
[1, 2, 3, 9]
>>> aList[3:] = [4, 5, 6] #等号两边的列表长度也可以不相等
>>> aList
[1, 2, 3, 4, 5, 6]
>>> aList[::2] = [0]*3 #隔一个修改一个
>>> aList
[0, 2, 0, 4, 0, 6]
>>> aList[::2] = ['a', 'b', 'c'] #隔一个修改一个
>>> aList
['a', 2, 'b', 4, 'c', 6]
>>> aList[::2] = [1] #左侧切片不连续,等号两边列表长度必须相等
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
aList[::2] = [1]
ValueError: attempt to assign sequence of size 1 to extended slice of size 3
(4)使用切片删除列表中的元素
>>> aList = [3, 5, 7, 9]
>>> aList[:3] = [] #删除列表中前3个元素
>>> aList
[9]
另外,也可以结合使用del命令与切片结合来删除列表中的部分元素,并且切片元素可以不连续。
>>> aList = [3, 5, 7, 9, 11]
>>> del aList[:3] #切片元素连续
>>> aList
[9, 11]
>>> aList = [3, 5, 7, 9, 11]
>>> del aList[::2] #切片元素不连续,隔一个删一个
>>> aList
[5, 9]