python3-序列切片

格式:[::]切片使用两个冒号分隔的3个数字来完成。

    第一个数字表示切片开始位置(默认为0)。

    第二个数字表示切片截止(但不包含)位置(默认为列表长度)。

    第三个数字表示切片的步长(默认为1),当步长省略是可省略最后一个冒号。

1.切片操作不会因为下标越界而抛出异常,而是简单地在列表尾部截断或者返回一个空列表。

>>> alist=[1,2,3,4,5,6,7,8,9,0,]
>>> alist[::]    #返回包含元素的新列表
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> alist[::-1]   #逆序的所有元素
[0, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> alist[::2]    #偶数位置,隔一个取一个
[1, 3, 5, 7, 9]
>>> alist[1::2]    #奇数位置,隔一个取一个
[2, 4, 6, 8, 0]
>>> alist[3::]    #从下标3开始的所有元素
[4, 5, 6, 7, 8, 9, 0]
>>> alist[3:6]    #下标在[3,6]之间的所有元素
[4, 5, 6]
>>> alist[0:100:1]  #前100个元素,自动截断
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> a[100:]      #下标100之后的所有元素,自动截断
[]
>>> x[100]      #直接使用下标访问会发生越界
Traceback (most recent call last):
  File "<pyshell#131>", line 1, in <module>
    x[100]
IndexError: list index out of range

 2.可以使用切片来原地修改列表内容

>>> alist
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> alist[len(alist):]=[9]    #在尾部追加元素
>>> alist
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9]>>> alist[:3]=[3,2,1]      #替换前三个元素
>>> alist
[3, 2, 1, 4, 5, 6, 7, 8, 9, 0, 9]
>>> alist[:3]=[]          #删除前三个元素
>>> alist
[4, 5, 6, 7, 8, 9, 0, 9]
>>> alist=list(range(10))
>>> alist
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[::2]=[0]*5        #替换偶数位置上的元素
>>> alist
[0, 1, 0, 3, 0, 5, 0, 7, 0, 9]  
>>> alilst[::2]=[0]*3        #切片不连续,两个元素个数必须一样多
Traceback (most recent call last):
  File "<pyshell#153>", line 1, in <module>
    alilst[::2]=[0]*3
NameError: name 'alilst' is not defined

 3.使用del与切片结合来删除列表元素

>>> alist=[3,4,5,6,7,]
>>> del alist[:3]      #删除前三个元素
>>> alist
[6, 7]
>>> alist=[3,4,5,6,7]  
>>> del alist[::2]    #删除偶数位置上的元素
>>> alist
[4, 6]

 4.切片返回的是列表元素的浅复制(浅复制是把原列表中所有元素的引用都复制都信列表中)

>>> alist=[3,5,7]
>>> blist=alist
>>> blist
[3, 5, 7]
>>> blist[1]= 8
>>> alist
[3, 8, 7]
>>> alist==blist
True
>>> alist is blist
True
>>> id(alist)
2848177707136
>>> id(blist)
2848177707136

 5.浅复制是把原列表中所有元素的引用都复制都信列表中

  原列表中只包含整数、实数、复数等基本类型或元组、字符串这样的不可变类型的数据,一般是没有问题的。

  原列表中包含列表之类的可变数据类型,由于浅复制是只是把子列表的引用复制到新列表中,修改任何一个都会影响另外一个。

>>> alist=[1,2,3]
>>> blist=alist[::]      #切片,浅复制
>>> alist==blist        #两个列表的元素完全一样
True
>>> alist is blist        #但不是同一个对象
False
>>> id(alist)==id(blist)    #内存地址不一样
False
>>> blist[1]=8          #修改一个不会影响另一个
>>> blist
[1, 8, 3]
>>> alist
[1, 2, 3]

 后续补充内容:

切片的功能:从起始位置到结束位置的前一个位置,按步长来提取数据并生成新的对象,并且不会改变原数据类型;

举例1,都写全:

 

L = [2,4,5,6,2,6,0,4]  #长度8

result = L[2:6:1]

print(result)

结果:[5,6,2,6]

可以看出,按步长1,从索引2开始,到索引6-1结束的所有元素

备注:以上的这些操作也同样适用于字符串或者元组中,对字符串进行反向显示,使用切片可以非常方便的做到;

举例2,省略步长:

L = [2,4,5,6,2,6,0,4]  #长度8

result = L[2:6]

print(result)

结果:[5,6,2,6]

可以看出,步长默认为1,可省略

 举例3,开始索引省略:

L = [2,4,5,6,2,6,0,4]  #长度8

result = L[:5]

print(result)

结果:[2,4,5,6,2]

可以看出,按步长1,从第一个元素开始,到索引5-1结束的所有元素

 举例4,结束索引省略:

L = [2,4,5,6,2,6,0,4]  #长度8

result = L[3:]

print(result)

结果:[6,2,6,0,4]

可以看出,按步长1,从索引3元素开始,到最后一个元素

 举例5,开始、结束索引都省略:

L = [2,4,5,6,2,6,0,4]  #长度8

result = L[:]

print(result)

结果:[2,4,5,6,2,6,0,4]

可以看出,相当于从第一个到最后一个元素,复制了一个新的序列

 举例6,步长非1但为正整数:

L = [2,4,5,6,2,6,0,4]  #长度8

result = L[2:6:2]

print(result)

结果:[5,2]

可以看出,按步长2,从索引2元素开始,到到索引6-1元素结束的所有元素

 举例7,步长为负整数:

L = [2,4,5,6,2,6,0,4]  #长度8

result = L[-2:-7:-3]

print(result)

结果:[0,6]

可以看出,按步长2,从索引-2元素开始,到到索引-7+1元素结束的所有元素

备注:切片时一定要保证步和的方向与开始、结束的方向一致,否则可能会得到一个空序列

 举例8,开始、结束省略,步长-1,可得到一个反向的序列:

L = [2,4,5,6,2,6,0,4]  #长度8

result = L[::-1]

print(result)

结果:[4, 0, 6, 2, 6, 5, 4, 2]

可以看出,开始、结束索引都省略,可以得到一个反向的序列

 

posted @ 2020-05-14 15:30  lemmon_water  阅读(496)  评论(0)    收藏  举报