3

文字列を逆にする特定のスライス操作が機能しない理由を誰かが説明できるかもしれません。私が理解していないスライスについて何かがあるに違いありません。基本操作:s[開始:終了:ステップ]

与えられた

s='abcd'

この文字列を逆にするには、デフォルト値を使用して実行できます

s[::-1]

また

s[-1::-1]

それらは問題ありませんが、なぜそうではないのですか

s[-1:-1:-1]

作業して、文字列全体を逆にしてくれますか? 文字列の最後の文字 (-1) から開始する必要があり、ステップサイズは -1 です。-1、つまりインデックス 0 の前に実行する必要があります。代わりに、'' を取得します。

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'?

ここで何が欠けていますか?

(文字列の反転に関する投稿をたくさん見ましたが、この特定の項目がどこかで説明されていれば、見逃していました)

4

6 に答える 6

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

同じ理由で機能しません

s[0:0]

あなたに「abcd」を与えません。

スライスするとき、それらの要素の位置ではなく、2 つの要素間のスペースを参照しています。つまり、-1 と -1 の間のスペース、つまり '' を求めています。

于 2012-04-13T16:11:34.290 に答える
3

このコンテキストでは、負のインデックスと非負のインデックスは 2 つの別個のクラスです。

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

あなたが言うときに期待しているように、後者が前者にオーバーフローしないようにスライスが定義されていることは、私にはかなり論理的に思えます。

-1、つまりインデックス0の前に1まで実行する必要があります

于 2012-04-13T16:15:16.300 に答える
3

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

startとはend両方-1なので同じです。スライスは、配列内の各要素を から までstart、毎回end増加します。stepすでに に達しているend場合、スライスは終了しています...したがって、 を返します''

試す:

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

ほぼ同じことですが、ポジティブであるため、これはより理にかなっています。

于 2012-04-13T16:10:51.077 に答える
1

You can't expect -1 to mean both the final item in the string and the "item before" the first item in the string. That would be inconsistent.

Perhaps you're imagining that Python is treating a string as a loop, and thinking of -1 as if it were simultaneously the "item before" 0 and the last item in the string. But that's not the case. For example, if that were the case, then this would hold:

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

But it doesn't. The result is simply the empty string.

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

The correct interpretation of negative indices in string slicing is as reverse indexing from the end of the string, not as cyclical indexing from 0.

As further food for thought, consider the following:

a = 'abcd'
a[-1:-(len(a) + 0):-1] == 'dcb'
a[-1:-(len(a) + 1):-1] == 'dcba'
a[-1:-(len(a) + 2):-1] == 'dcba'
于 2012-04-13T16:14:56.250 に答える
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
于 2012-04-13T16:23:54.380 に答える
1

あなたはスライスのポイント全体を逃しました

[start:end:stride]スライス演算子は次のようになります

ストライドが負の場合、ハイからローに移動しているため、開始は終了よりも大きくする必要があります。失敗したすべての例はそれに違反しています。

あなたは間違いなくExtended Slicingを読み始めるべきです

于 2012-04-13T16:12:15.747 に答える