在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/