2012-04-13 4 views
3

誰かがなぜ特定のスライス操作を 文字列を反転させるのか説明できないことがあります。私が を理解していないスライスに関するものがなければならない。基本操作:■ なぜ[-1:-1:-1]は文字列を逆転させることができませんか?

s='abcd' 

私は、デフォルト値を使用して行うことができ、この文字列を逆に考えると、[開始::最後のステップ]

s[::-1] 

または

s[-1::-1] 

ものがあります罰金、しかし、なぜですか?

s[-1:-1:-1] 

私は全体の文字列を逆にしてくれますか?それは で始まり、文字列の最後の文字は(-1)になり、stepsizeは-1になります。つまり、インデックス番号0の前に、 を1つ下げて実行する必要があります。代わりに「」を取得します。

for i in xrange(3, -2, -1): 
    print 's[-1:%d:-1] => ' %i, 
    print s[-1:i:-1] 

利回り:

s[-1:3:-1] =>  # didn't expect any output 
s[-1:2:-1] => d 
s[-1:1:-1] => dc 
s[-1:0:-1] => dcb 
s[-1:-1:-1] => # shouldn't this be 'dcba'? 

私がここで行方不明です何?

(私は、文字列を反転させる上で掲示をたくさん見ましたが、この特定のアイテムがどこかで説明された場合、私はそれを逃した)

+2

スライスが同じインデックスで開始して終了する場合、どのように空以外のものになる可能性がありますか? – FatalError

+0

@FatalErrorが言ったこと。ちなみに、 "1前1"はインデックス0ではなく、-2となります。算術的には、0は-1の後の1です。 – smci

+0

はい、0とそれ以下でダウンカウントしようとする文字列スライスを作成できます。しかし、それは不思議です: 's [2:-2:-1]'は不思議に空ですが、 '' [-2:2:-1] 'は一見しても動作しないように見えます。 – smci

答えて

6
s[-1:-1:-1] 

s[0:0] 

はあなたに 'ABCD' を与えないのと同じ理由で動作しません。

スライスするときは、の間のスペースを参照していますが、これらの要素の位置ではありません。 -1と-1の間のスペースを求めています。

+0

ありがとう.. "スライス"の意味よりむしろインデックス値自体に集中しすぎていた..つまり、非常に参考になった – Levon

3

>>> s[-1:-1:-1] 
>>> '' 

startendは両方-1ているので、彼らはあります同じ。スライスは配列の各要素をstartからendに移動し、毎回stepだけ増加します。すでにendに達している場合、スライスは終了しています。したがって、''を返します。

試してみてください。

>>> s[1:1:1] 
>>> '' 

それはほとんど同じことが、肯定的であるとして、これはより多くの意味を作るに役立つかもしれません。

+0

ありがとう..あなたは正しいです、それを見て、すべての肯定的なインデックス値はそれを明確にします。私の他の例(ループ内)は期待どおりに機能していたので、結論も間違っていると誤って考えました。 – Levon

1

あなたは

[start:end:stride]をスライスの全体のポイントは、スライスオペレータはストライドが負の場合あなたが高いから移動しているとして、その後、間違いなくあなたの開始が終了よりも大きくなければなりません

のようになります。見逃しています低い。失敗したすべての例がそれに違反します。

あなたは間違いなくあなたが-1は、文字列の最初の項目「前項目」の文字列両方最後の項目を意味するように期待することはできませんExtended Slicing

+0

のスペースだが、おそらくそれを見直すことで恩恵を受けることができた。 – Levon

1

読み始める必要があります。それは矛盾しているでしょう。

おそらく、あなたはPythonが文字列をループとして扱い、-1を「前の項目」0と最後の項目と同時に考えることを想像しているかもしれません。しかし、そうではありません。たとえば、そうであった場合、これは保持されます:

'abcd'[-2:-1:-1] == 'cbad' 

しかし、そうではありません。結果は単純に空の文字列になります。

>>> 'abcd'[-2:-1:-1] 
'' 

列スライスにおける負のインデックスの正しい解釈は、文字列の末尾からのような逆索引付け、0からないよう周期的インデキシングあります。思考のための更なる食品として

、次の点を考慮してください

a = 'abcd' 
a[-1:-(len(a) + 0):-1] == 'dcb' 
a[-1:-(len(a) + 1):-1] == 'dcba' 
a[-1:-(len(a) + 2):-1] == 'dcba' 
3

この文脈では、負および非負のインデックス二つの別々のクラスである:非負のインデックスは、最初から

  • 開始;
  • 負のインデックスは最後から始まります。

あなたが言うと期待しているように見えるように、そのスライスは、このような元に、後者は決してオーバーフローことが規定されている私にはかなり論理的なようだ:

それは1の前にダウンを実行すべきです - 1すなわちインデックス0

1

これは残念なことですね。ここでは厄介な回避策があります。

for i in range(3, -2, -1): 
    j = i if i != -1 else None 
    print 's[-1:%s:-1] => ' % str(j), 
    print s[-1:j:-1] 

s[-1:3:-1] => 
s[-1:2:-1] => d 
s[-1:1:-1] => dc 
s[-1:0:-1] => dcb 
s[-1:None:-1] => dcba 

ここでは同じことがバリエーションです。それほど厄介でないかどうかはわかりません。

for i in range(3, -1, -1) + [None]: 
    print 's[-1:%s:-1] => ' % str(i), 
    print s[-1:i:-1] 

s[-1:3:-1] => 
s[-1:2:-1] => d 
s[-1:1:-1] => dc 
s[-1:0:-1] => dcb 
s[-1:None:-1] => dcba