【问题标题】:Reverse string: string[::-1] works, but string[0::-1] and others don't反向字符串:string[::-1] 有效,但 string[0::-1] 和其他无效
【发布时间】:2014-03-04 06:21:36
【问题描述】:

我有点像 python/编程新手,我只是在玩字符串切片。因此,string[::-1] 的简单字符串反转方法工作得很好,正如我们所知,但在我的代码中还有其他实例会产生意想不到的结果:

In [1]: string = "Howdy doody"

In [2]: string[::]
Out[2]: 'Howdy doody'

In [3]: string[::-1]
Out[3]: 'ydood ydwoH'

In [4]: string[0:]    
Out[4]: 'Howdy doody'

In [5]: string[0::-1]
Out[5]: 'H'     # what up with this?

In [6]: string[:len(string)]
Out[6]: 'Howdy doody'

In [7]: string[:len(string):-1]
Out[7]: ''     # what up with this too?

In [8]: string[0:len(string)]
Out[8]: 'Howdy doody'

In [9]: string[0:len(string):-1]
Out[9]: ''    # And what up here too.

我已经评论了上面我希望字符串被反转的行,但我很惊讶为什么他们不简单地反转字符串。有谁知道这是怎么回事?

【问题讨论】:

  • 对于string[0::-1],这是因为您告诉 Python 从索引 0 开始并向后移动。当然,它不会反转字符串。你应该做string[len(string)-1::-1](或者令人惊讶的是string[len(string)::-1])来让字符串反转,就像mhlester在他的回答中所说的那样。
  • 这是一个我会接受两个答案的例子,但我只能选择一个!

标签: python string reverse slice


【解决方案1】:

在所有不起作用的情况下,您都是从开始开始,然后向后移动。没有比开始更进一步的了,所以你不会得到更多的字符。

这将是解决方案:

>>> string[len(string)::-1]
'ydood ydwoH'

切片符号为startendstep。如果step 是负数,start 应该大于end 才能得到任何东西。如果留空 ([::-1]),则会自动遵循细微差别

如果你只得到'H',那么为什么会有任何东西可能会让人感到困惑。但是想想写出来的解释:

start处的字符开始,按step递增,直到(但不包括)end

现在很清楚,因为你从 0 开始,所以包含了 0 字符

【讨论】:

    【解决方案2】:

    切片符号“[a:b:c]”表示“以c 为增量计数,从a 开始,直到b 不包括在内”。如果c 为负数,则向后计数,如果省略,则为1。如果a 被省略,则尽可能从计数方向开始(如果c 为正数,则为开始)如果为负则结束)。如果b 被省略,那么你会在你计数的方向上尽可能地结束(所以如果c 为正数则为结束,如果为负数则为开始)。如果 ab 为负数,则它是与结尾的偏移量(-1 是最后一个字符)而不是开头。

    好的,所以string[0::-1] 是一个字符,它表示“尽可能从索引0 向后计数”。尽可能是字符串的开头。

    string[0:len(string):-1] 或就此而言 string[0:anything:-1] 略有不同。它是空的,原因与string[1:0] 为空的原因相同。从一开始就无法到达切片的指定末端。您可以将此视为切片在开始“之前”结束(因此为空),或者您可以将结束点自动调整为等于起点(因此切片为空)。

    string[:len(string):-1] 表示“从末尾倒数到但不包括索引len(string)”。无法到达该索引,因此切片为空。

    您没有尝试string[:0:-1],但这意味着“从末尾倒数到但不包括索引 0”。所以这就是除了第一个字符之外的所有内容,颠倒了。 [:0:-1][::-1],因为 [0:len(string)-1][:]。在这两种情况下,切片的排除端都是被包含的切片的最后一个字符的索引,并且省略了结束。

    您也没有尝试string[-1::-1],它与string[::-1] 相同,因为-1 表示字符串的最后一个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 2014-07-14
      • 2021-05-25
      • 1970-01-01
      • 2020-12-06
      • 2020-01-21
      相关资源
      最近更新 更多