请解释Python序列反转

时间:2012-01-08 20:10:54

标签: python string reverse

不确定我在哪里挑选它,但它卡住了,我一直都在使用它。

有人可以解释这种字符串逆转是如何工作的吗?我用它来测试回文字符串而不先将其转换为可变类型。

>>> word = "magic"
>>> magic = word[::-1]
>>> magic
'cigam' 

我会尽我最大的猜测,但我不想对任何关于这个有用技巧背后的内部结构有任何先入之见。

4 个答案:

答案 0 :(得分:7)

切片表示法如下:

my_list[start:end:step]

所以,当你[::-1]时,它意味着:

  • start:没有(默认)
  • end:没有(默认)
  • step: - -1(后代顺序)

因此,您将从列表末尾(默认)转到第一个元素(默认),将索引减一(-1)。

因此,正如许多答案所说,没有排序也没有就地交换,只是切片符号。

答案 1 :(得分:4)

你可以看看这里 - 它是extended slice

答案 2 :(得分:3)

答案 3 :(得分:2)

这个“技巧”只是将切片操作应用于序列的特定实例。您也可以使用它来生成列表或元组的反向副本。来自同一家族的另一个“技巧”:[:]通常用于生成列表的(浅)副本。

“Python 2.3中的新功能”是进入迷宫的一个意想不到的切入点。让我们从一个更明显的(?)位置开始,current 2.X documentation for sequence objects

在序列操作表中,您将看到一行,其中Operation = s [i:j:k],Result =“从i到j的切片,步骤为k”,而Notes =“(3) (5)”。

注3说“如果i或j是负数,则索引相对于字符串的结尾:len(s)+ i或len(s)+ j被替换。但请注意-0仍为0。 “

注5说“具有步骤k的从i到j的s的切片被定义为具有索引x = i + n * k的项目序列,使得0 <= n <(ji)/ k。换句话说,索引是i,i + k,i + 2 * k,i + 3 * k等等,当达到j时停止(但从不包括j)。如果i或j大于len(s) ,使用len(s)。如果i或j被省略或None,它们将成为“结束”值(结束取决于k的符号)。注意,k不能为零。如果k为None,则将其视为1 。“

我们有k == -1,所以使用的索引是i,i-1,i-2,i-3等等,当达到j时停止(但从不包括j)。要获得观察到的效果,用于i的“end”值必须为len(s)-1,并且用于j的“end”值必须为-1。因此,使用的指数是last,last-1,...,2,1。

另一个切入点是考虑如果语言中不存在[::-1],我们如何为任何序列产生这样的结果:

def reverse_traversal_of_sequence(s):
    for x in range(len(s) - 1, -1, -1):
        do_something_with(s[x])