web-dev-qa-db-ja.com

python文字列を逆方向にループする最良の方法

python文字列を逆方向にループする最良の方法は何ですか?

以下は、-1オフセットのすべての必要性について少し厄介に思えます。

string = "trick or treat"
for i in range(len(string)-1, 0-1, -1):
    print string[i]

以下はもっと簡潔に思えますが、実際には逆の文字列が生成されるため、パフォーマンスがわずかに低下しますか?

string = "trick or treat"
for c in string[::-1]:
    print c
40
clwen

reversedビルトインを試してください:

for c in reversed(string):
     print c

reversed()呼び出しは、文字列全体をコピーするのではなく、反復子を作成します。

PEP 322 は、reversed()の動機と、他のアプローチに対する利点を詳しく説明しています。

72

reversedなどの組み込み機能を使用せずに文字列を反転する方法を次に示します。負のステップ値は逆方向にトラバースします。

def reverse(text):
    rev = ''
    for i in range(len(text), 0, -1):
        rev += text[i-1]
    return rev
5
Nathan

はい、2番目の構文のショートカットは中間文字列を作成し、パフォーマンスが低下します。

最初のバージョンは次のように書かれた方が良いです:

for index, char in enumerate(reversed(s)):
   print "pos %d: %s" % (index, char)

理解するのは簡単です。 reversedenumerate `も、文字列のコピーを作成する必要はありません。

また、変数名としてstringを使用する場合は注意してください。これは、 標準ライブラリのモジュール の名前でもあります。

4
Triptych
 string = "trick or treat"
 for c in string[::-1]:
     print c

私はそれを使用します。おそらくもっと速い方法があるかもしれませんが、おそらく非常に高速です(しかし、私はそれを疑います)。

編集:実際、私が一緒にハッキングしたプログラムを使用した2回目のテストでは、おそらくreversedが道です。

 ==== Results ====
Sample 1: 0.0225071907043 # Using a for loop
Sample 2: 0.0100858211517 # Using reversed
3
AJ00200

通常、Pythonではコードが少ないほど速くなります。幸いなことに、あなたは推測する必要はありません:

python -mtimeit -s"s='x'*100000" "for x in s[::-1]: pass"
100 loops, best of 3: 1.99 msec per loop

python -mtimeit -s"s='x'*100000" "for x in reversed(s): pass"
1000 loops, best of 3: 1.97 msec per loop

python -mtimeit -s"s='x'*100000" "for i in xrange(len(s)-1, 0-1, -1): s[i]"
100 loops, best of 3: 4.95 msec per loop

そのため、短いコードは少し高速ですが、メモリオーバーヘッドが発生します。

3
Jochen Ritzel

reversedは反復可能を取り、後方に移動する反復子を返します。 string[::-1]は問題ありませんが、新しい逆の文字列を作成します。単に繰り返したい場合、これはおそらくより良いでしょう:

for c in reversed(string):
    print c

後で逆の文字列を使用したい場合は、一度作成することをお勧めします。

2
Cat Plus Plus
string = "trick or treat"
for c in reversed(string):
    print c

あなたが望むと思うことをします。反復子を使用します。これは、__ reveresed __()または__len __()および__getitem __()が実装されているすべてのもので動作するはずです。 __getitem __()は、0から始まるint引数を取る必要があります。

2
krousey
def reverse(text):
    x = ""
    for i in range(len(text)):
        x = x + text[len(text)-i-1]
    return x
1
praveen

Forループを使用してPythonで文字列を反転する

outputStr = ''
a = raw_input("Enter String: ")
for i in range(len(a), 0, -1):
    outputStr += a[i-1]
print outputStr
1
Akshay Malhotra

enumerateおよびreversedメソッドを使用したPython 3:

string = "trick or treat"
for i, c in enumerate(reversed(string)):
    print(i, c)

Print(c)は、インデックスなしで各文字を取得するためだけに使用できます。

0
ian0411