Python——切片(Slice)

切片 | 实现机制

Python 中对字符串、列表、元组等序列类型数据的通过下标索引访问以及简洁高效的切片操作都是通过由解释器调用的该对象的魔法方法__getitem__()实现的。

a = ['a', 'b', 'c', 'd', 'e']

以下两个操作等效

>>> a[1]
'b'

>>> a.__getitem_(1)
'b'
切片 | 操作实例

类似于range(),切片的三个参数分别代表开始索引、结束索引和步长值。参数间使用:分隔开。即

[start: end: step]

下面以列表进行演示。

a = [1, 3, 5, 8, 10, 13, 18, 36]
  • 遍历所有元素
>>> a[:]
[1, 3, 5, 8, 10, 13, 18, 36]
>>> a[::]
[1, 3, 5, 8, 10, 13, 18, 36]
  • 支持负数(倒数)索引
>>> a[-6: -2]
[5, 8, 10, 13]
  • 取出下标为偶数的元素,即步长为 2
>>> a[: : 2]
[1, 5, 10, 18]
  • 逆序取出所有元素
>>> a[: : -1]
[36, 18, 13, 10, 8, 5, 3, 1]
  • 逆序取出下标为偶数的元素
>>> a[: : -2]
[36, 13, 8, 3]
  • 替换多个元素
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[0:3] = ['a','b','c']
>>> a
['a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]
  • 在某个位置插入多个元素
>>> a[3:3] = ['a','b','c']
>>> a
[0, 1, 2, 'a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]
  • 在开始位置之前插入多个元素
>>> a= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[:0] = ['a','b','c']
>>> a
['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 删除切片
>>> a= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[3:6]
>>> a
[0, 1, 2, 6, 7, 8, 9]

当然,切片不仅仅能作用于列表,比如说,字符串

>>> s = "I&; d0L8aO#4VqwE89 fWU#$"

>>> s[: : 3]
'I LOVE U'

事实上,所有的序列类型数据都支持切片操作。

常见的序列类型有:字符串、列表、元组等。

多维数组切片
方式一

list 切片类似 C 数组,多维度分别用[]索引,单维度切片用:,如:

>>> a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> a[1][1:3]
[5, 6]

但是这样做第二个维度索引不起作用:

>>> a[1:3][0:2]
[[4, 5, 6], [7, 8, 9]]

把 list当作 ndarray 去 slice 也是不对的:

方式二

ndarray切片用一个”[]“里面加逗号的方式,如:

>>> a = np.round(np.random.rand(3,3)*10)
array([[9., 5., 1.],
       [3., 1., 5.],
       [2., 5., 5.]])

>>> a[1:3,0:2]
array([[3., 1.],
       [2., 5.]])

这样做第二个维度索引不起作用:

>>> a[1:3][0:2]
array([[3., 1., 5.],
       [2., 5., 5.]])
References

Python多维数组切片

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值