一句话概述
反向切片中,切片的开始和结束值,和正向切片的区间刚好反过来。
创建列表,逆序取数
>>> a = list(range(20))
>>> a[::-1]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
设置结束值为5,逆序取数。结果不是5个,而是20-6=14个
>>> a[:5:-1]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6]
>>>
再把开始值写0,取不到数据。
>>> a[0:5:-1]
[]
测试了几次,发现逆序取数时,切片的开始端点和结束端点需要反着写,即切片的开始值需要大于结束值。
不写开始值的时候,正序切片默认开始值为0,结束值为序列长度;逆序切片默认开始值为-1,结束值为-序列长度-1。
>>> a[:5:-1]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6]
>>> a[-1:5:-1]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6]
>>> a[19:5:-1]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6]
>>> a[-1:-15:-1]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6]
>>> a[:-15:-1]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6]
上面第二行的测试结果,开始值为-1,结束值为5,开始值要小于结束值。上面的说法更准确的表达是,将两个值所在坐标轴的零点统一后,开始值需要大于结束值,才能逆序取到数。
正向取数时,零点是首位,首位为0,往后1,2,3依次递增;逆向取数时,零点是末位,末位为-1,往后-2,-3,依次递减。
猜测的取数逻辑如下:
def get_reversed_data(s, start=None, end=None, step=1):
"""
逆序取序列的数据
:param s: 序列
:param start: 区间开始值
:param end: 区间结束值
:param step: 符号为正,逆序取值的步长
:return: 区间数据
"""
start = -1 if start is None else start
end = -len(s)-1 if end is None else end
# 统一为正向取数的零点
start_idx = start if start > 0 else len(s) + start
end_idx = end if end > 0 else len(s) + end
# 超过边界的值控制在边界处
start_idx = 0 if start_idx < 0 else start_idx
start_idx = len(s) if start_idx > len(s) else start_idx
end_idx = -1 if end_idx < -1 else end_idx
end_idx = len(s)-1 if end_idx >= len(s) else end_idx
# 开始取数
idx = start_idx
res = []
while idx > end_idx:
res.append(s[idx])
idx -= step
return res
代码暂时没测试出问题。