-
列表切片(List Slice)
Python中的列表存储的是一系列数据,每个数据都可以通过索引来修改或引用它的值。假设我要取列表中的连续的一片数据,比如索引从1开始到6结束,但不包括索引为6的所有数据,应该怎么操作呢?这可以通过编写代码实现,以下是示例代码:
-
>>> data =[3,2,7,6,8,10,24,76,8] # 定义列表 >>> start = 1 # 定义起始索引 >>> end = 6 # 定义结束索引 >>> subdata = [ ] # 定义空列表 >>> for index in range(start,end): # 从start到end迭代index subdata.append(data[index]) # 给列表添加数据 >>> subdata [2, 7, 6, 8, 10] >>>
上面的确是一个不错的方法,但是每次取一序列数据都要编写一段代码吗?答案是否定的。Python早为我们准备好了更简洁的语法来获取列表中的一片数据。这叫做切片,对列表进行切片操作,返回的结果也是列表。显然,我们需要知道起始索引和结束索引,就像上面一样,然后把这两个值放在中括号中以冒号隔开。以下是切片语法示例:
-
>>> sub = data[start:end] # 取data列表中以start开始,end结束,不包括end索引数据的数据 >>> sub [2, 7, 6, 8, 10] >>>
我们看到,结果和我们上面编写的程序运行的结果是一模一样的。以下是图示:
- 上图起始索引是1,结束索引是6。如果不写start,那么会默认从零开始,如果不写end,那么会把start后面的所有数据都包括。如果两个都不写,相当于拷贝了列表。我们来实践一下:
-
>>> data =[3,2,7,6,8,10,24,76,8] >>> data[:5] # 取从索引为0开始到5结束的所有数据(不包括索引为5,下同) [3, 2, 7, 6, 8] >>> data[5:] # 取从索引为5开始的所有数据 [10, 24, 76, 8] >>> data[:] # 取从索引为0开始的所有数据 [3, 2, 7, 6, 8, 10, 24, 76, 8] >>>
由于列表中最后一个数据的索引可以写为-1,所以下面的语法也是可以的。
-
>>> data[5:-1] # 取从索引为5开始到最后一个数据的所有数据 [10, 24, 76] >>> data[:-4] # 取从0开始到索引为-4的那一序列数据 [3, 2, 7, 6, 8] >>>
如果要取1,3,5,7索引号的这几个数据应该怎么取呢?这也可以通过编写一个程序来实现,当然Python也为我们准备好了语法,接下来先学习步长。
步长(Step)
- 步长,就是每步的长度之简称。它的英文为step,就是步骤,步子的意思。我们知道,range可以生成一系列整数。它有步长这个参数,如range(1,10,2)中的2就是步长。它能产生1,3,5,7,9这几个数据。 在这里,每步的长度是2,当我们不写第三个参数的时候,步长默认为1。如果要取列表[3,2,7,6,8,10,24,76,8]中的索引号为奇数的所有数据,我们先来编个程序完成这个要求,请看代码:
-
>>> subdata = [] >>> data = [3,2,7,6,8,10,24,76,8] >>> for index in range(1,8,2): subdata.append(data[index]) >>> subdata [2, 6, 10, 76] >>>
当然,Python也为我们准备好了语法,我们只要在切片的时候再加一个参数就行了。这个参数就是步长。上面得出来的结果,我们只要用subdata = data[1:8:2]这句代码就行了。以下是图例:
- 上面data[1:8:2]中的2就是步长,像range命令一样,不写它的值它是默认为1的,所以data[1:8:]和data[1:8]的值是一样的。步长一般是正数,它也可以是负数,这时候我们就要倒着取数据,如data[-1:0:-1],表示从最后一个数据开始,倒着取数据,一直取到索引为0的数据,所以返回的列表是:[8, 76, 24, 10, 8, 6, 7, 2]。看下面两种取法,返回的列表是一样的:
-
>>> data[-1::-1] # 取从倒数第一个数据开始的所有数据 [8, 76, 24, 10, 8, 6, 7, 2, 3] >>> data[::-1] # 由于步长为-1,所以也是取从倒数第一个数据开始的所有数据 [8, 76, 24, 10, 8, 6, 7, 2, 3]
前面说了,如果不写起始索引,那么默认为0,不过那是在步长为正数的情况。如果步长为负数,那么不写起始索引的话,默认是-1。综上所述,列表切片语法图为:
李兴球
李兴球的博客是Python创意编程原创博客