2012-01-08 12 views
-1

私はこれをどこで選んだのかはっきりしませんが、固まって、いつも使っています。Pythonシーケンスの逆転について説明してください。

誰かがこの文字列反転の仕組みを説明できますか?私は回文型の文字列を、最初に可変型に変換せずにテストするために使用します。

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

私は私の最高の推測を置くだろうが、私はこの便利なトリックの背後にある内部に関するあらゆる先入観で歩くことをしたくありません。

+3

このソートはどのように? –

+0

「ソート」から「リバーサル」に変更してもいいですが、「インプレース」でもありません。変数 'string'は同じままです。 –

+0

@DavidRobinsonそれを指摘していただきありがとうございます。私の先入観は、私が実現した以上に私を抱きしめていたようです。 – Droogans

答えて

7

はスライス表記はこのように書きます:

my_list[start:end:step] 

をので、あなたが[::-1]を行うとき、それは意味:

  • start:何も(デフォルト)
  • end:何も(デフォルト)
  • step:-1(子孫)

リストの最後(デフォルト)から最初の要素(デフォルト)に移動し、インデックスを1減らします(-1)。

だから、多くの答えが言っているように、並べ替えや位置の入れ替えはなく、スライス表記だけです。

+0

私はいくつかの読書をしました...それと同等のステートメントは 'word [None:None:-1]'でしょう。これは私の事例をいくつかの新しい角度から見ていくのに役立ちました。ありがとう! – Droogans

3
+0

-1答えとしてリンクを投稿しないでください。 – Droogans

+0

@Droogans:あなたはむしろ、「それは2.3以降にどのように働いたのか」と言うでしょうか?それがすべてです。 –

+1

あなたがコメントを投稿していたら...はい。 – Droogans

4

こちらをご覧ください - それはextended sliceです。

+0

-1答えとしてリンクを投稿しないでください。 – Droogans

+7

なぜですか?それは私ができることよりも説明が良い公式な文書です(説明のコピーを除いて)。 – fkerber

+2

Upvoted!ドキュメントで何かがうまく説明されていれば、リンクを共有するだけでリワークが回避されます。 –

2

この「トリック」は、スライス操作をシーケンスに適用する特定の例です。これを使用して、リストまたはタプルの逆コピーを作成することもできます。同じファミリの別の「トリック」:[:]は、リストの(浅い)コピーを作成するためによく使用されます。

「Python 2.3の新機能」は、予期せぬ迷路のエントリポイントです。より明白な(?)の場所、current 2.X documentation for sequence objectsから始めましょう。

オペレーション= s [i:j:k]、結果= "ステップkのiからjへのスライス"、およびノー​​ト= "(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、j + 1 * k、i + 2 * k、i + 3 * kなどとなり、jに達したときに停止するがjを含まない場合、iまたはjがlen(s) IまたはJを省略又はなし、それらは(kの符号に依存端)「終了」値となっていない場合。LEN(S)を使用する。注、kはゼロにすることはできません。kはいずれもない場合、それは1のように扱われます。 "

我々は、K == -1を持っているので、使用されるインデックスは、I-1、I-2、I-3及びJに達したときにように、停止(しかし決して含まないj)はIです。観察された効果を得るために、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]) 
関連する問題