web-dev-qa-db-ja.com

スライシングによる文字列反転の理解

私は文字列を逆方向に印刷する方法を探していましたが、グーグルで簡単に検索した後、この方法を見つけました:

aが文字列変数であるとします。これはa文字列を逆方向に返します:

a[::-1]

誰もそれがどのように機能するか説明できますか?

34
liewl

確かに、[::]拡張スライス 演算子です。サブストリングを取得できます。基本的に、[begin:end:step]として必要な要素を指定することで機能し、すべてのシーケンスで機能します。それについて2つのきちんとしたこと:

  • 1つ以上の要素を省略でき、「正しいこと」を行います
  • Begin、end、およびstepの負の数には意味があります

開始と終了の場合、負の数を指定すると、シーケンスの最後からカウントすることを意味します。たとえば、リストがある場合:

l = [1,2,3]

l[-1]は3、l[-2]は2、l[-3]は1です。

step引数の場合、負の数は、シーケンス内でbackwards動作することを意味します。リストの場合::

l = [1,2,3,4,5,6,7,8,9,10]

l[::-1]と書くことができます。これは基本的に、リストを読みながら-1のステップサイズを使用することを意味します。 Pythonは、開始と終了を埋めるときに「正しいことをする」ので、リストを逆方向に反復して[10,9,8,7,6,5,4,3,2,1]を返します。

リストを使用して例を示しましたが、文字列は別のシーケンスであり、同じように機能します。 a[::-1]は、文字列を逆方向にたどって得た文字を結合して文字列を作成することを意味します。

73
Rick Copeland

「-1」部分はスライスの「ステップ」部分を表します。この場合、一度に1文字ずつ文字列を通過しますが、逆方向になります(負のステップは文字列の最後から開始することを意味します)。たとえば、ステップを2に指定した場合、最初の文字から始まる文字列の他のすべての文字が取得されます。 -2のステップを指定すると、文字列の他のすべての文字が取得され、最後の文字から始めて逆方向に処理されます。

簡単に言えば、a = '12345'の場合:

  • a[::2]135になります
  • a[::-1]54321になります
  • a[::-2]531になります
7
hbw

以下は、逆の印刷文字列に対してもう少し理にかなっていると思いますが、それは私だけかもしれません:

for char in reversed( myString ):  
  print( char, end = "" )
6
Stefan Kendall

拡張スライス表記

sequence[start:end:step]

この場合、ステップ-1は逆方向を意味し、開始と終了を省略すると、文字列全体が必要になります。

3
Steve Jessop

Pythonのスライス表記と呼ばれます。ここで、その仕組みについてもう少し読むことができます。

Pythonのスライス表記を説明する

2
Gary Willoughby

私はこのようにします:

variable = "string"
message = ""
for b in variable:
    message = b+message
print (message)

そしてそれは印刷します:gnirts

2
irnus44

拡張スライシングを使用しています-文字列はPythonのシーケンスであり、他のシーケンス(リストとタプル)といくつかのメソッドを共有しています。スライスには、開始、停止、ステップの3つの部分があります。それらのすべてにデフォルト値があります-開始デフォルトは0、停止デフォルトはlen(sequence)、ステップデフォルトは1です。 、最後まで1つずつ逆方向に進みます。

この機能はPython 2.3.5で導入されました。詳細は What's New docs をご覧ください。

2
Adam

[::-1]は、ストリングaのスライスを提供します。完全な構文はa[begin:end:step]これは、a [begin]、a [begin + step]、... a [end-1]を提供します。ステップが負の場合、最後から開始して開始に移動します。

最後に、beginはデフォルトでシーケンスの最初に、最後まで終わり、-1にステップします。

2
Andrew Jaffe

基本的なステップ表記です。次の機能を考慮してください。

a [2:4:2]

起こることは、インデックスが位置2と4の間でスライスされることです。3番目の変数は、最初の値から開始してステップサイズを設定します。この場合、a [4]は上限であるため、a [2]が返されます。2つの値のみが返され、2番目のステップは実行されません。 (-)マイナス演算子は、単にステップ出力を逆にします。

1
Oliver

文字列は基本的に文字のシーケンスであるため、スライシング操作が機能します。あなたがしていることは実際には:

->「a」のスライスを最初から最後まで1ずつ戻します。

1
fengshaun

appendとpopを使用して実行できます

def rev(s):
    i = list(s)
    o = list()
    while len(i) > 0:
        o.append(t.pop())

    return ''.join(o)
0
tony

最初の2つの境界のデフォルトは0で、シーケンスの長さは前述のとおりで、ストライド-1は、スライスが通常の左から右ではなく右から左に移動することを示します。したがって、効果はシーケンスを逆にすることです。

name="ravi"
print(name[::-1]) #ivar
0
Ravi G

拡張スライス構文の使用

Word = input ("Type a Word which you want to reverse: ")
def reverse(Word):
  Word = Word[::-1]
  return Word
print (reverse(Word))
0
Dev Ranjan

以下のリストを検討してください

l=[12,23,345,456,67,7,945,467]

リストを逆にするためのもう1つの方法は次のとおりです。

l[len(l):-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12]

l[:-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12]

l[len(l)::-1] [467, 945, 7, 67, 456, 345, 23, 12]

リバースまたは[::-1]を使用しない場合、再帰に基づいた最も簡単なバージョンを以下に示します。

def reverse(s):

  if len(s)==2:
    return s[-1] + s[0]

  if len(s)==1:
    return s[0]

  return s[-1] + reverse(s[1:len(s)-1]) + s[0]
0
winterjack

Reverse()関数を使用できます。例えば

x = "abcd"
for i in reversed(x):
        print(i, end="")
print("\n")
L = [1,2,3]
for i in reversed(L):
        print(i, end="")

dcbaおよび321を出力します

0
Anagnostou John