如果您在Python中定义一个字符串,例如:
x = "1234567890"
print(x[::-1])
以相反的顺序打印字符串,但是
print(x[0:10:-1])
什么也不打印。
他们为什么不打印相同的东西?
答案 0 :(得分:3)
请参见relevant docs的注释5:
步骤 k 中从 i 到 j 的 s 切片被定义为具有索引
x = i + n*k
,使0 <= n < (j-i)/k
。换句话说,索引是i
,i+k
,i+2*k
,i+3*k
,依此类推,在达到 j 时停止(但从不包括 j )
因此,当您在i = 0, j = 10, k = -1
中指定[0:10:-1]
时,不存在满足公式n
的{{1}}值,因此该范围为空。
另一方面,在0 <= n < (j-i)/k
中,[::-1]
。请参阅注释5的下一部分:
如果省略 i 或 j 或无,它们将成为“结束”值(该结束取决于 k 的符号)。
由于i == j == None
为负,因此k
变成i
,其值为len(s) - 1
。 9
不能用任何数字表示(因为j
会截断最后一个字符)。
答案 1 :(得分:1)
您应该了解基本规则x[start:stop:step]
。在您的代码中,您放置了两个不同的规则:print(x[0:10:-1])
和print(x[::-1])
。
当您在start
和stop
索引中未放置任何内容时,将使用默认值(取决于步骤)来执行代码。如果步长为正,则start
的索引将来自0
,而stop
是字符串的长度。在这里,您可以自定义start
和stop
的值,只要它们满足start < stop
。
另一方面,如果步长为负,则start
索引将从字符串的最后一个索引开始,而stop
为0
。在这里,您还可以自定义start
和stop
的值,只要它们满足start > stop
。
在您的情况下,您写了print(x[0:10:-1])
却一无所获。显然,这是因为您将0
设置为开始索引,将10
设置为终止索引而步长为负。
参考:https://www.digitalocean.com/community/tutorials/how-to-index-and-slice-strings-in-python-3
答案 2 :(得分:0)
您正在寻找>>> x = list(range(10))
>>> x[10:0:-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
。
x[start:end:step]
我们可以使用以下伪代码对i = start
if start < end:
cond = lambda: i < end
else:
cond = lambda: i > start
while cond():
SELECT x[i]
i += step
进行建模:
{{1}}