web-dev-qa-db-ja.com

逆ストリング:string [::-1]は機能しますが、string [0 ::-1]およびその他は機能しません

私はややpython/programming newbieで、ストリングスライシングをいじっています。したがって、string[::-1]の単純な文字列リバースメソッドは、ご存じのとおり正常に機能しますが、以下のコードには予期しない結果をもたらす他のインスタンスがあります。

In [1]: string = "Howdy doody"

In [2]: string[::]
Out[2]: 'Howdy doody'

In [3]: string[::-1]
Out[3]: 'ydood ydwoH'

In [4]: string[0:]    
Out[4]: 'Howdy doody'

In [5]: string[0::-1]
Out[5]: 'H'     # what up with this?

In [6]: string[:len(string)]
Out[6]: 'Howdy doody'

In [7]: string[:len(string):-1]
Out[7]: ''     # what up with this too?

In [8]: string[0:len(string)]
Out[8]: 'Howdy doody'

In [9]: string[0:len(string):-1]
Out[9]: ''    # And what up here too.

上記の行で、文字列が逆になると予想した箇所についてコメントしましたが、文字列が単純に逆にならない理由を見て驚いています。誰がそれを知っていますか?

27
Darren Haynes

スライス表記「[a:b:c]」は、「cを含むaから始まり、bまでの増分でカウントする」という意味です。 cが負の場合、逆方向にカウントします。省略した場合は1です。aが省略された場合は、カウントしている方向から可能な限り開始します(したがって、cが正の場合は開始、負の場合は終了)。 bが省略されている場合は、カウントしている方向で可能な限り終了します(したがって、cが正の場合は終了、負の場合は開始です)。 aまたはbが負の場合、開始ではなく終了(-1が最後の文字)からのオフセットになります。

OK、したがって_string[0::-1]_は1文字で、「可能な限りインデックス0から逆方向にカウントします」ということです。可能な限り、文字列の始まりです。

string[0:len(string):-1]またはその点で_string[0:anything:-1]_は微妙に異なります。 _string[1:0]_が空であるのと同じ理由で空です。スライスの指定された終わりに最初から到達することはできません。これは、スライスが開始する前に終了した(したがって空である)と考えることも、終了点が開始点と等しくなるように自動的に調整されると考えることもできます(したがって、スライスは空です)。

string[:len(string):-1]は、「インデックスlen(string)までではなく最後までカウントする」ことを意味します。そのインデックスに到達できないため、スライスは空です。

_string[:0:-1]_を試したわけではありませんが、それは「インデックス0を含まない最後まで逆方向にカウントする」ことを意味します。だから、最初の文字を除いて、すべて逆です。 _[:0:-1]_は_[::-1]_に対して、[0:len(string)-1]は_[:]_に対してです。どちらの場合も、スライスの除外された終了は、終了が省略されたスライスの最後の文字に含まれていたインデックスです。

また、_string[-1::-1]_は文字列の最後の文字を意味するため、_string[::-1]_と同じである_-1_も試しませんでした。

48
Steve Jessop

動作していないすべてのケースでは、-開始開始に移動してから後方に移動しています。先頭よりも後方にはないため、文字を取得することはできません。

これが解決策になります:

>>> string[len(string)::-1]
'ydood ydwoH'

スライス表記はstartendstepです。 stepが負の場合、startendよりも大きくなければ、何も取得できません。空白([::-1])のままにすると、そのニュアンスが自動的に追跡されます

'H'のみを取得した場合、anythingが存在した理由がわかりにくい場合があります。しかし、書かれた説明を考えてください:

startの文字で始まり、stepずつ増加します(ただし、含まない)end

0で始まるため、0文字が含まれていることが明らかになりました。

17
mhlester