std::string
C++ では、次のように繰り返すことができます。
std::string str = "Hello World!";
for (int i = 0; i < str.length(); ++i)
{
std::cout << str[i] << std::endl;
}
Python で文字列を反復処理するにはどうすればよいですか?
ヨハネスが指摘したように、
for c in "string":
#do something with c
for loop
コンストラクトを使用して、Python でほとんど何でも反復処理できます。
たとえば、open("file.txt")
ファイル オブジェクトを返し (そしてファイルを開き)、それを反復処理すると、そのファイル内の行が反復処理されます。
with open(filename) as f:
for line in f:
# do something with line
それが魔法のように思えるなら、それはちょっと魔法のようですが、その背後にある考え方は本当に単純です.
あらゆる種類のオブジェクトに適用してfor
ループを機能させることができる単純な反復子プロトコルがあります。
メソッドを定義する反復子を実装し、クラスにメソッドnext()
を実装して反復可能にします。__iter__
(__iter__
もちろん、 は反復子オブジェクト、つまり を定義するオブジェクトを返す必要がありますnext()
)
文字列を反復処理するときにインデックスにアクセスする必要がある場合は、次を使用しますenumerate()
。
>>> for i, c in enumerate('test'):
... print i, c
...
0 t
1 e
2 s
3 t
さらに簡単:
for c in "test":
print c
より包括的な答えを出すために、正方形のペグを丸い穴に押し込みたい場合は、文字列を反復処理する C の方法を Python に適用できます。
i = 0
while i < len(str):
print str[i]
i += 1
しかし、繰り返しになりますが、文字列は本質的に反復可能であるのに、なぜそうするのでしょうか?
for i in str:
print i
文字列を反復処理するためにより機能的なアプローチを使用したい場合 (おそらく何らかの形で変換するため)、文字列を文字に分割し、それぞれに関数を適用してから、結果の文字のリストを結合して文字列に戻すことができます。
文字列は本質的に文字のリストであるため、'map' は文字列を 2 番目の引数として繰り返し処理し、最初の引数である関数をそれぞれに適用します。
たとえば、ここでは単純なラムダ アプローチを使用します。なぜなら、私がやりたいのは文字への些細な変更だけだからです。ここでは、各文字の値をインクリメントします。
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'
またはより一般的に:
>>> ''.join(map(my_function, my_string))
my_function は char 値を取り、char 値を返します。