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
reversed
などの組み込み機能を使用せずに文字列を反転する方法を次に示します。負のステップ値は逆方向にトラバースします。
def reverse(text):
rev = ''
for i in range(len(text), 0, -1):
rev += text[i-1]
return rev
はい、2番目の構文のショートカットは中間文字列を作成し、パフォーマンスが低下します。
最初のバージョンは次のように書かれた方が良いです:
for index, char in enumerate(reversed(s)):
print "pos %d: %s" % (index, char)
理解するのは簡単です。 reversed
も enumerate
`も、文字列のコピーを作成する必要はありません。
また、変数名としてstring
を使用する場合は注意してください。これは、 標準ライブラリのモジュール の名前でもあります。
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
通常、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
そのため、短いコードは少し高速ですが、メモリオーバーヘッドが発生します。
reversed
は反復可能を取り、後方に移動する反復子を返します。 string[::-1]
は問題ありませんが、新しい逆の文字列を作成します。単に繰り返したい場合、これはおそらくより良いでしょう:
for c in reversed(string):
print c
後で逆の文字列を使用したい場合は、一度作成することをお勧めします。
string = "trick or treat"
for c in reversed(string):
print c
あなたが望むと思うことをします。反復子を使用します。これは、__ reveresed __()または__len __()および__getitem __()が実装されているすべてのもので動作するはずです。 __getitem __()は、0から始まるint引数を取る必要があります。
def reverse(text):
x = ""
for i in range(len(text)):
x = x + text[len(text)-i-1]
return x
Forループを使用してPythonで文字列を反転する
outputStr = ''
a = raw_input("Enter String: ")
for i in range(len(a), 0, -1):
outputStr += a[i-1]
print outputStr
enumerate
およびreversed
メソッドを使用したPython 3:
string = "trick or treat"
for i, c in enumerate(reversed(string)):
print(i, c)
Print(c)は、インデックスなしで各文字を取得するためだけに使用できます。