2012-01-08 23 views
-1

不知道我在哪裏找到了,但它卡住了,我一直在使用它。請解釋Python序列逆轉

有人可以解釋這個字符串翻轉是如何工作的嗎?我用它來測試迴文字符串,而不先將其轉換爲可變類型。

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

我會把我最好的猜測,但我不希望走在這個有用的技巧背後的內部任何成見。

+3

這是怎麼排序? – 2012-01-08 20:12:01

+0

很好,你從「排序」改爲「反轉」,但它也不是「就地」。變量'string'保持不變。 – 2012-01-08 20:25:11

+0

@DavidRobinson謝謝你指出。看起來我的先入爲主讓我回想起來比我意識到的要多。 – Droogans 2012-01-08 20:32:06

回答

7

切片符號是這樣的:

my_list[start:end:step] 

所以,當你做[::-1],它意味着:

  • start:沒有(默認)
  • end:沒有(默認)
  • step:-1(派生順序)

因此,您將從列表的末尾(默認)到第一個元素(默認),將索引減少一(-1)。

因此,儘可能多的回答說,沒有排序和就地交換,只是切片符號。

+0

我做了一些閱讀......相當的陳述將是'word [None:None:-1]'......這幫助我從幾個新角度看待我的例子。謝謝! – Droogans 2012-01-08 20:46:42

4

你可以看看這裏 - 這是一個extended slice

+0

-1請不要張貼鏈接作爲答案。 – Droogans 2012-01-08 20:18:40

+7

爲什麼不呢?這是一個官方文檔,它比我能解釋得更好(除了複製解釋)。 – fkerber 2012-01-08 20:20:08

+2

Upvoted!如果在文檔中解釋得很好,共享鏈接就避免了返工。 – 2012-01-08 20:22:40

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的「結束」值必須是len(s)-1,並且用於j的「結束」值必須是-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])