当前位置 博文首页 > zy010101博客:Python——分片的强大功能

    zy010101博客:Python——分片的强大功能

    作者:[db:作者] 时间:2021-06-11 15:34

    分片的强大功能

    一些细节

    从某一个位置开始进行切片,到整个序列结束。例如:

    >>> 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]
    

    如果不太好理解分片赋值是如何将整个片段给替换掉的。可以分成两步来理解。

    1. 删除,删除等号左边指定的分片
    2. 插入,将包含在等号右边可迭代对象中的片段插入旧分片被删除的位置。

    这样有助于理解可以插入多个元素,但是实际情况并非如此。

    空分片

    以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()等方法。

    增删改查

    增加

    尾部追加,相当于append()方法

    >>> 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]
    

    任意位置插入(除了末尾追加),相当于insert()方法

    >>> 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]      # 注意,不能逆序查找。逆序查找的结果是空。
    []
    
    下一篇:没有了