我在这里阅读了一些关于将切片与消极步幅相结合的答案,但以下问题仍然让我感到困惑。在几个地方,我已经看到下面的图表用于说明切片符号的工作原理(指间隙,而不是条目):
+---+---+---+---+
| T | e | s | t |
+---+---+---+---+
0 1 2 3 4
-4 -3 -2 -1
这些示例与上图一致:
>>> "Test"[2:]
'st'
>>> "Test"[-2:]
'st'
但是
>>> "Test"[-2::-1]
'seT'
似乎不一致 - 如果从-2
分隔符开始,并向后计数,为什么s
也包含在返回的字符串中?
答案 0 :(得分:4)
因此,您拥有的心理模型仅对正步幅值有用,但在使用负步幅时无效。请改用以下图片:
+---+---+---+---+
| T | e | s | t |
+---+---+---+---+
0 1 2 3 4
-5 -4 -3 -2 -1
您标记索引,不边界。
边界模型很好,但只是为了更容易忘记结果索引未包含在结果值中的事实。通过仅对索引编号并省略结束索引,您可以看到正向和反向步幅如何工作。
有关细节的详细信息,请查看官方文档,了解Python计算切片的方式;来自sequence type notes(注5):
s[i:j:k]
从步骤s
i
到j
的{{1}}切片被定义为索引k
的项目序列,x = i + n*k
。换句话说,索引是0 <= n < (j-i)/k
,i
,i+k
,i+2*k
等等,在达到i+3*k
时停止(但从不包括{{1} }})。如果j
或j
大于i
,请使用j
。如果省略len(s)
或len(s)
或i
,则它们会变为“结束”值(结束取决于j
的符号)。请注意,None
不能为零。如果k
为k
,则会将其视为k
。
因此,对于你的消极步伐,价值变为:
None
其中1
是'end',这里是-1,因为那是你在负面步骤中用完字符串的点。然后指数成为:
i = len(s) - 2 = 2
j = None = -1 (end for negative strides, *not* len(s) - 1)
k = -1
给你3个指数。
答案 1 :(得分:1)
如果"Test"[-2:]
包含s
,则按照相同的逻辑,它会在s
中包含"Test"[-2::-1]
,因为范围包含第一个位置但不包括第二个位置位置。