如何使用显式 "slice of s from i to j with step k" 反转字符串?

How to reverse a string using explicit "slice of s from i to j with step k"?

我已经看到 ::-1 可用于反转字符串,但我认为找到可以完成这项工作的显式整数 i:j:k 会很有趣。

我找到了文档 common-sequence-operations,但无法使用它。此代码测试很短:

s = "abcd"
print(1,s[4:3:-1]) 
print(2,s[4:2:-1])    
print(3,s[4:1:-1])
print(4,s[4:0:-1])
print(5,s[4:-1:-1])  

这是输出:

1 
2 d
3 dc
4 dcb
5 

看起来你不能用明确的公式来做到这一点,s[i:j:k]

通常我可以通过试错来弄清楚简单的编程,但这在这里行不通。也许仔细阅读文档会让我克服这个问题!

你必须这样做:

s = "abcd"
print(s[len(s):-len(s)-1:-1])

或者,正如 Terry Jan Reedy 在评论中指出的,下面的写法很好地说明了切片的长度 (stop - start) / step:

print(s[-1:-1-len(s):-1])

问题是负索引从后面开始,所以负索引对应以下"real"个索引:

-1 ->  3
-2 ->  2
-3 ->  1
-4 ->  0  # -len(s)
-5 -> -1  # that's the one you need (or any smaller number)

0-len(s) 不够,因为切片的 stop 索引是独占的,所以你必须降低一个。