Python切片

1 切片、索引

  切片(slice)是对序列型对象如list、string、tuple的一种高级索引方法,对于经常取指定范围索引的操作,使用切片非常方便。
   Python中的基本索引:对于一个索引序列a,基本索引的语法为a[index],这一点不难理解。但是需要注意,Python中支持负数下标索引。也就是说,Python索引下标可用所有的连续整数。

-4,-3,-2,-1,0,1,2,3,4 # 整数序列

  可以这么理解,索引的下标可以为所有整数,分为自然数索引与负数索引。自然数索引,大多数编程语言中都是类似的,而负数索引则代表序列中倒数第几个。这与所有连续整数在坐标轴上排列的位置顺序对应。
  如列表a=[1,2,3,4,5]a[-2]则是指其中倒数第二个值,即4.

2 切片格式

  切片使用的格式如下:
  索引对象名[开始索引:结束索引:步长]

  开始索引结束索引,限定了需要取的索引的范围。他们相当于一个左开右闭的区间:[开始索引:结束索引),即切片结果中包括开始索引下标对应的值而不包括结束索引下标对应的值。若为负数索引,步长则是指间隔,意为每隔几个元素取一次。
  开始索引、结束索引与步长,都可以省略不写,开始索引省略不写,代表从第一个元素开始,结束索引省略不写,代表到最后一个元素结束或者说是序列长度值(可以取到最后一个元素),步长省略不写,默认步长为1,代表一个一个取。

3 切片的使用

  弄清楚切片操作的范围,即开始索引、结束索引、步长所确定的范围,切片可以进行的操作就能够变得很容易理解。

3.1 访问

  访问单个元素

a = [1, 3 ,4 ,99, 7, 26, 8, 54, 66]
>>> print(a[3])
99
>>> print(a[-2])
54

  访问整个对象

a = [1, 3 ,4 ,99, 7, 26, 8, 54, 66]
>>> print(a[:])
[1, 3 ,4 ,99, 7, 26, 8, 54, 66]
>>> print(a[::])
[1, 3 ,4 ,99, 7, 26, 8, 54, 66]
# 逆序
>>> print(a[::-1])
[66, 54, 8, 26, 7, 99, 4, 3, 1]
# 默认最先出现的:是左边的,这里代表到倒数第一个元素结束
>>> print(a[:-1])
[1, 3, 4, 99, 7, 26, 8, 54]

  多层切片,相当于前边切片取到的结果再取一次切片(得到的结果还可以再取切片),很容易理解

a = [1, 3 ,4 ,99, 7, 26, 8, 54, 66]
>>> print(a[2:6])
[4, 99, 7, 26]
>>> print(a[2:5][1:3])
[99, 7]

  取到指定位置的索引,如奇数位、偶数位等,用步长来进行控制

a = [1, 3 ,4 ,99, 7, 26, 8, 54, 66]
# 奇数位置
>>> print(a[0:6:2])
[1, 4, 7]
# 偶数位置
>>> print(a[1:6:2])
[3, 99, 26]

  索引长度超过列表长度?如何处理呢?
  不管是自然数索引还是负数索引,要看想要取到的区间与索引对象实际的下标区间有没有交集,如果有,则可以取到,如果没有则取不到。

a = [1, 3 ,4 ,99, 7, 26, 8, 54, 66]
# 索引长度根本没有18,取到最后一个
>>> print(a[0:18])
a = [1, 3 ,4 ,99, 7, 26, 8, 54, 66]
# 如果是从第18个开始取?取不到
>>> print(a[18:])
[]

3.2 插入和修改

  这两个放在一起说,是因为其本质上可以理解为替换。如果给定的区间范围长度为0,则为添加,如果给定的区间长度部位0,则为修改。
  因此如果步长为1的情况下,即需要替换的区间是连续的,那么替换的内容的长度不受任何限制,如原本长度为5的一段可以替换为长度为3的一段,原本长度为3的一段也可以替换为长度为5的一段。如果步长不为1,那么就意味着需要进行修改的元素是不连续的,替换者被替换者长度需要一致。
  如尾部、中间、头部添加:

a = [1, 3 ,4 ,99, 7, 26, 8, 54, 66]
# 尾部添加
>>> a[9:] = [222, 333]
>>> print(a)
[1, 3, 4, 99, 7, 26, 8, 54, 66, 222, 333]
# 头部添加
>>> a[:0] = [101, 202]
>>> print(a) 
[101, 202, 1, 3, 4, 99, 7, 26, 8, 54, 66, 222, 333]
# 指定位置(第二个位置)添加
>>> a[2:2] = [5555, 6666]
>>> print(a)
[101, 202, 5555, 6666, 1, 3, 4, 99, 7, 26, 8, 54, 66, 222, 333]
# 替换,可以看出只是对应段的替换
a[1:12] = [71, 72, 73]
>>> print(a)
[101, 71, 72, 73, 66, 222, 333]
>>> a[1:3] = [1,2,3,4,5]
>>> print(a)
[101, 1, 2, 3, 4, 5, 73, 66, 222, 333]
# 不连续, 如左边切片长度为4,右边为2会出错
>>> a[::3] = [81, 82]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: attempt to assign sequence of size 2 to extended slice of size 4
# 长度对应一致,方可替换
>>> a[::3] = ['替','换','成','功']
>>> print(a)
['替', 1, 2, '换', 4, 5, '成', 66, 222, '功']

3.3 删除

  删除,本质上也可以理解为替换操作,只不过是将对应区间替换为空的切片**[]**,为什么要单独讲一下呢?因为删除还有一个自己特定的用法——del

# 普通替换
a = [1, 3, 4, 99, 7, 26, 8, 54, 66]
>>> a[4:]=[]
>>> print(a)
[1, 3, 4, 99]
# 使用del删除,连续区间
a =[101, 71, 72, 73, 66, 222, 333]
>>> del a[2:5]
>>> print(a)
[101, 71, 222, 333]
# 使用del删除,指定位置,如奇数位置
>>> del a[::2]
>>> print(a)
[71, 333]

4 总结

  掌握切片操作,关键在于弄清楚操作的位置(或者说是区间),从本质上来讲,我们可以通过切片进行操作。读就是访问,访问序列对象中指定位置的元素,写就是增加或修改或删除,其本质是一样的,明确要操作的位置,就不难进行操作了。

  所行之路非坦途,但不要丢下对风景的期待。
  Till next time.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你若向前

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值