2009-04-19 75 views
32

我正在寻找一种向后打印字符串的方法,在google上快速搜索后,我发现此方法:在Python中反转字符串

假设'a'是一个字符串变量。这将返回'a'字符串:

a[::-1] 

任何人都可以解释它是如何工作的?

+0

**请seealso **:HTTP://计算器.com/a/33457266/42223,它解决了python的这个特性,有些人可能会发现“古怪”。 – dreftymac 2015-12-02 11:08:40

回答

68

诚然,[::]extended slice运营商。它可以让你基本上,它通过指定你想要的[begin:end:step]这个元素来工作,并且它适用于所有序列。关于它的两件巧妙的事情:

  • 可以省略元素的一个或多个与它的“正确的事”
  • 负数的开始,结束和步有意义

表示开始和结束,如果你给一个负数,它意味着从序列的末尾开始计数。例如,如果我有一个列表:

l = [1,2,3] 

l[-1]然后是3,l[-2]是2,并且l[-3]是1

对于step参数,一个负数表示通过工作向后序列。因此,对于一个列表::

l = [1,2,3,4,5,6,7,8,9,10] 

你可以写l[::-1]这基本上意味着使用-1步长,同时通过列表读取。在填充开始和停止时,Python将“做正确的事情”,以便它向后遍历列表并给你[10,9,8,7,6,5,4,3,2,1]

我给出了列表的例子,但字符串只是另一个序列,并以相同的方式工作。所以a[::-1]意味着通过向后走过字符串来连接字符来构建字符串。

+0

使用负向步进/步幅时,“正确的”可能会有点混乱。 [示例在这里](http://stackoverflow.com/q/399067/936083)。 – Darthfett 2012-03-07 22:49:54

3

这是extended slice notation

sequence[start:end:step] 

在这种情况下,步骤-1意味着向后,而省略开始和结束意味着你想要整个字符串。

7

“-1”部分表示切片的“step”部分 - 在这种情况下,它一次经过字符串1字符,但是向后(负的步骤意味着从字符串的末尾开始) 。例如,如果将步骤指定为2,则会从第一个字符开始,获取字符串的其他任何字符。如果你指定了一个-2的步长,那么你会得到字符串的其他所有字符,从最后一个字符开始并向后工作。

因此,概括地说,如果a = '12345'

  • a[::2]成为135
  • a[::-1]成为54321
  • a[::-2]成为531
2

它使用扩展切片 - 一个字符串,是一个序列在Python中,并与其他序列共享一些方法(na mely列表和元组)。有三部分切片 - 开始,停止和步骤。它们都有默认值 - 默认值为0,默认为len(sequence),step默认值为1.通过指定[:: - 1],你会说“从头开始的所有元素,到最后一次后退一会。

此功能在Python 2.3.5介绍,你可以在What's New docs阅读更多。

2

[:: - 1]给出了字符串a的一部分。完整的语法是a[begin:end:step] 它给出了一个[begin],一个[begin + step],... a [end-1]。如果步骤是否定的,则从头开始并开始。

最后,开始默认为序列的开始,结束并且步进到-1。

1

一个字符串本质上是一个字符序列,所以切片操作对它起作用。你正在做的事实上是:

- >从1开始到结尾以1为单位逐步得到一片'a'。

5

我认为有以下使得在反向打印字符串多一点感觉,但也许这只是我:

for char in reversed(myString): 
    print(char, end = "") 
+0

那是'end =“”'的意思吗? – 2009-04-19 23:52:04

+0

这是python 3在每次打印结束时都不换行的方式。 在python 2.x中,你可以直接写 print(char,) – 2009-04-20 02:06:22

1

我会做这样的:

variable = "string" 
message = "" 
for b in variable: 
    message = b+message 
print (message) 

和它打印: gnirts

0

考虑下面的列表

l=[12,23,345,456,67,7,945,467] 

逆转名单另一种技巧可能是:

l[len(l):-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12] 

l[:-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12] 

l[len(l)::-1] [467, 945, 7, 67, 456, 345, 23, 12] 
0

我们可以利用追加和流行做

def rev(s): 
    i = list(s) 
    o = list() 
    while len(i) > 0: 
     o.append(t.pop()) 

    return ''.join(o) 
1

它的基本步符号,考虑的功能:

一个[ 2:4:2]

会发生什么情况是索引在位置2和4之间切片,第三个变量的作用是设置从第第一价值。在这种情况下,它会返回一个[2],因为[4]是一个上限,只有两个值返回并且没有第二步发生。 ( - )减号运算符简单地反转步骤输出。

0

不使用逆转或[:: - 1],这里是一个基于递归一个简单的版本,我认为是最可读:

def reverse(s): 

    if len(s)==2: 
    return s[-1] + s[0] 

    if len(s)==1: 
    return s[0] 

    return s[-1] + reverse(s[1:len(s)-1]) + s[0]