为什么s [len(s)-1:-1:-1]不起作用?

时间:2014-09-17 04:01:41

标签: python string slice string-length

在查看一些python字符串和函数时,我发现了这个奇怪的python怪癖:

s = "hello"
print s[::-1]

然后打印:olleh

但是,print s[len(s)-1:-1:-1]不起作用。我的理解是它应该从最后一个元素s[len(s)-1]迭代到第一个元素s[0]。但是,它只打印一个空字符串'',我认为这是因为在一些给定长度的字符串中(例如,5),s[4] == s[-1]。但是,我不明白为什么python决定使用-1而不是4,这是实际的len(s)

此外,s[len(s):0:-1] + s[0]有效。为什么len(s)是有效索引? python是否只是将len(s)任意转换为0?

P.S。这是在Python 2.7.8中,我不确定它是否也适用于3.x.x

编辑:在Python 3中确认是相同的

4 个答案:

答案 0 :(得分:5)

切片表示法是这样的:

s[start:stop:step]

具体而言,stop正在达到但不包括它。将此翻译成您要求的内容:

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

这是基于'hello'

的长度5
s[4:-1:-1]

s[4:4:-1]

是一个空的或零长度的字符串。


我在这里对切片表示法进行了更深入的阐述:Explain Python's slice notation

答案 1 :(得分:2)

负序索引从序列末尾开始计算,因此您只是获得[-1:-1:-1],或等效[4:4:-1],这是零长度字符串。

答案 2 :(得分:1)

请记住,索引从0开始,而不是1。

[len(s)-1]获取最后一个字母('o'

:-1只是'o',因为您获得了最后一个值。

那么你想要从最后一个值...到最后一个值...反转(-1)。当然,这将返回一个空字符串。

要回答您的第二个问题,因为使用索引表示法时不会出现任何错误。尝试print s[32489375:2784:-123]

答案 3 :(得分:1)

您使用负面步骤向后映射。默认值为:

  

从0到len(集合)的步骤

当你使用负步时,指数也需要反转,否则你将走很长的路。例如,from 0 to 5 by -1为:0 + -1 = -1; -1 + -1 = -2 ...一段时间后整数溢出......)

为了避免这种漫长的走动,当step为负数时,Python会反转索引并将其视为:

  

从len(集合)到0逐步

这意味着您需要将startend值作为len(collection)的负整数处理 - 所以,如果您想要反向获取整个字符串,您正在寻找:

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

或者,简单来说:

  

从{集合中的最后一项}到{集合中的第一项} by -1

This answer也对指数有一个很好的视觉解释。