在查看一些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中确认是相同的
答案 0 :(得分:5)
切片表示法是这样的:
s[start:stop:step]
具体而言,stop
正在达到但不包括它。将此翻译成您要求的内容:
s[len(s)-1:-1:-1]
这是基于'hello'
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逐步
这意味着您需要将start
和end
值作为len(collection)
的负整数处理 - 所以,如果您想要反向获取整个字符串,您正在寻找:
s[-1:-(len(s) + 1):-1]
或者,简单来说:
从{集合中的最后一项}到{集合中的第一项} by -1
This answer也对指数有一个很好的视觉解释。