【问题标题】:Why does s[len(s)-1:-1:-1] not work?为什么 s[len(s)-1:-1:-1] 不起作用?
【发布时间】:2014-11-10 23:43:51
【问题描述】:

在查看一些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?

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

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

【问题讨论】:

    标签: python string slice string-length


    【解决方案1】:

    切片符号是这样的:

    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

    【讨论】:

      【解决方案2】:

      您正在使用负一步向后映射。默认为:

      从 0 到 len(collection) 一步一步

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

      为了避免在step 为负数时,Python 会反转索引并将其视为:

      从len(collection)逐步到0

      这意味着您需要在这种情况下将 startend 值处理为来自 len(collection) 的负整数 - 因此,如果您想反向获取整个字符串,您正在寻找:

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

      或者,更简单地说:

      从 {the last item in the collection} 到 {the first item in the collection} -1

      This answer 对索引也有很好的视觉解释。

      【讨论】:

        【解决方案3】:

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

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

        :-1 又是'o',因为你得到的是最后一个值。

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

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

        【讨论】:

          【解决方案4】:

          负索引是从序列末尾开始计算的,所以你只会得到[-1:-1:-1],或者等价的[4:4:-1],它是零长度的字符串。

          【讨论】:

            猜你喜欢
            • 2015-08-30
            • 2018-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-27
            • 2021-05-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多