2009-04-19 61 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]