Python的列表切片(List Slice)教程

Python的列表切片(List Slice)教程

  1. 列表切片(List Slice)

    Python中的列表存储的是一系列数据,每个数据都可以通过索引来修改或引用它的值。假设我要取列表中的连续的一片数据,比如索引从1开始到6结束,但不包括索引为6的所有数据,应该怎么操作呢?这可以通过编写代码实现,以下是示例代码:

  2. >>> 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早为我们准备好了更简洁的语法来获取列表中的一片数据。这叫做切片,对列表进行切片操作,返回的结果也是列表。显然,我们需要知道起始索引和结束索引,就像上面一样,然后把这两个值放在中括号中以冒号隔开。以下是切片语法示例:

  3. >>> sub = data[start:end]	 # 取data列表中以start开始,end结束,不包括end索引数据的数据       
    >>> sub		       
    [2, 7, 6, 8, 10]
    >>>
    

    我们看到,结果和我们上面编写的程序运行的结果是一模一样的。以下是图示:

  4. 上图起始索引是1,结束索引是6。如果不写start,那么会默认从零开始,如果不写end,那么会把start后面的所有数据都包括。如果两个都不写,相当于拷贝了列表。我们来实践一下:
  5. >>> 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,所以下面的语法也是可以的。

  6. >>> data[5:-1]           # 取从索引为5开始到最后一个数据的所有数据
    [10, 24, 76]
    >>> data[:-4]            # 取从0开始到索引为-4的那一序列数据
    [3, 2, 7, 6, 8]
    >>>
    

    如果要取1,3,5,7索引号的这几个数据应该怎么取呢?这也可以通过编写一个程序来实现,当然Python也为我们准备好了语法,接下来先学习步长。

    步长(Step)

  7. 步长,就是每步的长度之简称。它的英文为step,就是步骤,步子的意思。我们知道,range可以生成一系列整数。它有步长这个参数,如range(1,10,2)中的2就是步长。它能产生1,3,5,7,9这几个数据。 在这里,每步的长度是2,当我们不写第三个参数的时候,步长默认为1。如果要取列表[3,2,7,6,8,10,24,76,8]中的索引号为奇数的所有数据,我们先来编个程序完成这个要求,请看代码:
  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]这句代码就行了。以下是图例:

  9. 上面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]。看下面两种取法,返回的列表是一样的:
  10. >>> 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。综上所述,列表切片语法图为:

  11. python列表切片
李兴球

李兴球的博客是Python创意编程原创博客

评论已关闭。