Python数组切片用法详解

在Python使用过程中,经常用到切片,本文总结了一下切片的用法。

ASCII art diagram,帮助理解Python切片:

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1
>>> a = ['P','y','t','h','o','n']
>>> a[0:1]
 ['P']
>>> a[1:3]
 ['y','t']
 
>>> a[-2:-1]
 ['o']
>>> a[:-1]
 ['P', 'y', 't', 'h', 'o']

不带步长step参数的切片,步长默认为1:

a[start:stop]  # 返回从stop-1开始到stop的元素
a[start:]      # 返回从start开始的剩余部分
a[:stop]       # 去掉最后stop个元素并返回剩余元素
a[:]           # 复制数组a

带步长step参数的切片:

a[start:stop:step] 

索引为复数的切片:

a = ['P','y','t','h','o','n']
a[-1]    # 返回数组中最后一个元素 -->'n'
a[-2:]   # 返回数组中最后两个元素 -->['o', 'n']
a[:-2]   # 去掉数组中最后两个元素并返回剩余元素 -->['P', 'y', 't', 'h']

步长为复数的切片:

a[::-1]    # 颠倒数组中的元素并返回 -->['n', 'o', 'h', 't', 'y', 'P']
a[1::-1]   # 颠倒数组中的前两个元素并返回 -->['y', 'P']
a[:-3:-1]  # 颠倒最后两个元素并返回 -->['n', 'o']
a[-3::-1]  # 颠倒除最后两个元素以外的元素并返回 -->['h', 't', 'y', 'P']

与slice()对象的关系:以下两种用法是相同的

a[start:stop:step] 
a[slice(start, stop, step)]

与索引(index)的区别:
ASCII art diagram 帮助理解二者区别:

                +---+---+---+---+---+---+
                | P | y | t | h | o | n |
                +---+---+---+---+---+---+
Slice position: 0   1   2   3   4   5   6
Index position:   0   1   2   3   4   5
>>> a = ['P','y','t','h','o','n']
# 索引
>>> a[0]
 'P'
>>> a[5]
 'n'
# 切片
>>> a[0:1]
 ['P']
>>> a[0:2]
 ['P','y']

另一种理解方式:


步长为正:


>>> seq[:]                # [seq[0],   seq[1],          ..., seq[-1]    ]
>>> seq[low:]             # [seq[low], seq[low+1],      ..., seq[-1]    ]
>>> seq[:high]            # [seq[0],   seq[1],          ..., seq[high-1]]
>>> seq[low:high]         # [seq[low], seq[low+1],      ..., seq[high-1]]
>>> seq[::stride]         # [seq[0],   seq[stride],     ..., seq[-1]    ]
>>> seq[low::stride]      # [seq[low], seq[low+stride], ..., seq[-1]    ]
>>> seq[:high:stride]     # [seq[0],   seq[stride],     ..., seq[high-1]]
>>> seq[low:high:stride]  # [seq[low], seq[low+stride], ..., seq[high-1]]

步长为负:

>>> seq[::-stride]        # [seq[-1],   seq[-1-stride],   ..., seq[0]    ]
>>> seq[high::-stride]    # [seq[high], seq[high-stride], ..., seq[0]    ]
>>> seq[:low:-stride]     # [seq[-1],   seq[-1-stride],   ..., seq[low+1]]
>>> seq[high:low:-stride] # [seq[high], seq[high-stride], ..., seq[low+1]]

参考:
https://stackoverflow.com/questions/509211/understanding-slice-notation
https://www.w3schools.com/python/ref_func_slice.asp
https://www.geeksforgeeks.org/python-slice-function/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

datamonday

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

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

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

打赏作者

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

抵扣说明:

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

余额充值