不确定我在哪里挑选它,但它卡住了,我一直都在使用它。
有人可以解释这种字符串逆转是如何工作的吗?我用它来测试回文字符串而不先将其转换为可变类型。
>>> word = "magic"
>>> magic = word[::-1]
>>> magic
'cigam'
我会尽我最大的猜测,但我不想对任何关于这个有用技巧背后的内部结构有任何先入之见。
答案 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])