不知道我在哪裏找到了,但它卡住了,我一直在使用它。請解釋Python序列逆轉
有人可以解釋這個字符串翻轉是如何工作的嗎?我用它來測試迴文字符串,而不先將其轉換爲可變類型。
>>> word = "magic"
>>> magic = word[::-1]
>>> magic
'cigam'
我會把我最好的猜測,但我不希望走在這個有用的技巧背後的內部任何成見。
不知道我在哪裏找到了,但它卡住了,我一直在使用它。請解釋Python序列逆轉
有人可以解釋這個字符串翻轉是如何工作的嗎?我用它來測試迴文字符串,而不先將其轉換爲可變類型。
>>> word = "magic"
>>> magic = word[::-1]
>>> magic
'cigam'
我會把我最好的猜測,但我不希望走在這個有用的技巧背後的內部任何成見。
切片符號是這樣的:
my_list[start:end:step]
所以,當你做[::-1]
,它意味着:
start
:沒有(默認)end
:沒有(默認)step
:-1(派生順序)因此,您將從列表的末尾(默認)到第一個元素(默認),將索引減少一(-1)。
因此,儘可能多的回答說,沒有排序和就地交換,只是切片符號。
我做了一些閱讀......相當的陳述將是'word [None:None:-1]'......這幫助我從幾個新角度看待我的例子。謝謝! – Droogans 2012-01-08 20:46:42
你可以看看這裏 - 這是一個extended slice。
這個「技巧」只是一個應用切片操作到序列的特定實例。您也可以使用它來生成列表或元組的反轉副本。來自同一個家族的另一個「技巧」:[:]
通常用於生成列表的(淺)副本。
「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])
這是怎麼排序? – 2012-01-08 20:12:01
很好,你從「排序」改爲「反轉」,但它也不是「就地」。變量'string'保持不變。 – 2012-01-08 20:25:11
@DavidRobinson謝謝你指出。看起來我的先入爲主讓我回想起來比我意識到的要多。 – Droogans 2012-01-08 20:32:06