Pythonを使用して文字列の各文字を繰り返す


517

C ++では、次のstd::stringように反復できます。

std::string str = "Hello World!";

for (int i = 0; i < str.length(); ++i)
{
    std::cout << str[i] << std::endl;
}

Pythonで文字列を反復するにはどうすればよいですか?

回答:


441

ヨハネスが指摘したように、

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()

公式ドキュメントを見る


14
注意点としては、反復がでアーカイブされて逆転:逆(「文字列」)におけるCのために
AkseliPalén

ドキュメントのどの部分から、文字列がイテレータ型であることを知っていますか?
winklerrr 2017年

DIR()を参照してstring..you ITER 属性を。
shadow0359

312

文字列を反復処理するときにインデックスにアクセスする必要がある場合は、次を使用しますenumerate()

>>> for i, c in enumerate('test'):
...     print i, c
... 
0 t
1 e
2 s
3 t

9
プロのヒント:それはゼロから始まります。あなたは1からそれを起動する必要がある場合:1 t2 e3 s4 tパラメータを使用して「開始」:for i, c in enumerate('test', start=1)
MESSA

90

さらに簡単:

for c in "test":
    print c

私はPythonの初心者です。どういうわけか、これは私の環境ではコンパイルされません、そして私はそれを機能させるためにブラケットにcを入れなければなりませんでした: for c in "test": print (c) なぜですか?
Mauro Vanetti 2014

7
@MauroVanettiこれはほぼ間違いなくPython 3を使用しているためです。私が質問に回答したとき、AFAIKにはPython 2しかありませんでした
Johannes Weiss

37

より包括的な答えを出すために、本当に正方形のペグを丸い穴に押し込みたい場合は、文字列を反復するCの方法をPythonで適用できます。

i = 0
while i < len(str):
    print str[i]
    i += 1

しかし、繰り返しますが、なぜ文字列が本質的に反復可能であるのですか?

for i in str:
    print i

6
最初のwhileループの代わりに、次のことを行うことができます。enumerateを使用したmarcogの答えはさらに優れています。
アイハム

1
これは、長い間Cを使用していたことに基づいている可能性がありますが、ほとんどの場合、このC風の方法を使用することになります。たとえば、4桁の数字が散らばっているファイルがあり、そのすべてが0から始まります。したがって、「0」を見つけてそれと次の3文字を取得し、ある場合は数字を複製せずに次に進む必要があります。それに続く別の0。インデックスの制御が必要なため、「for c in str」または「for i、c in enumerate(str)」メソッドは機能しません。ただし、正規表現の方がはるかに優れていると思います。
gkimsey

1
for i in range(len(...))悪です。python 2.xでは、range()リストを作成するため、非常に長い場合、非常に大きなメモリブロックが割り当てられる可能性があります。xrange()これらの場合は、少なくとも使用してください。また、同じ文字列の繰り返しインデックス作成は、文字列を直接反復するよりもはるかに遅くなります。インデックスが必要な場合は、を使用してくださいenumerate()
izak 2016年

6

まあ、このような面白いことをして、forループを使用して仕事をすることもできます

#suppose you have variable name
name = "Mr.Suryaa"
for index in range ( len ( name ) ):
    print ( name[index] ) #just like c and c++ 

答えは

氏 。S uryaa

ただし、range()はシーケンスである値のリストを作成するため、名前を直接使用できます

for e in name:
    print(e)

これも同じ結果を生成し、見栄えがよくなり、リスト、タプル、辞書などの任意のシーケンスで機能します。

私たちは2つの組み込み関数(PythonコミュニティのBIF)を使用しました

1)range()-range()BIFはインデックスの作成に使用されます例

for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4

2)len()-len()BIFは、指定された文字列の長さを見つけるために使用されます


4

文字列を反復するためのより機能的なアプローチを使用したい場合(おそらく何らかの方法で変換する場合)、文字列を文字に分割し、それぞれに関数を適用してから、結果の文字のリストを文字列に結合することができます。

文字列は本質的に文字のリストであるため、「マップ」は文字列を反復します-2番目の引数として-関数-最初の引数-をそれぞれに適用します。

たとえば、ここでは簡単なラムダアプローチを使用しています。これは、文字を少し変更するだけなので、ここで各文字の値をインクリメントするためです。

>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'

より一般的には:

>>> ''.join(map(my_function, my_string))

ここで、my_functionはchar値を取り、char値を返します。


2

ここでいくつかの回答が使用されますrangexrange完全にインスタンス化されたリストではなく、ジェネレータを返すため、通常はより優れています。さまざまな長さのメモリまたは反復可能オブジェクトが問題になる可能性がある場合xrangeは、優れています。


1
これはPython 2にのみ適用されることに注意してください。Python2は少数派になったことを期待しています
Sam Mason

0

必要な状況で実行する場合はget the next char of the word using __next__()、を作成しstring_iteratorて反復し、original string (it does not have the __next__() method)

この例では、char =が見つかると[、次の単語を探し続けますが]、見つからないので、__ next__を使用する必要があります

ここでは、文字列のforループは役に立ちません

myString = "'string' 4 '['RP0', 'LC0']' '[3, 4]' '[3, '4']'"
processedInput = ""
word_iterator = myString.__iter__()
for idx, char in enumerate(word_iterator):
    if char == "'":
        continue

    processedInput+=char

    if char == '[':
        next_char=word_iterator.__next__()
        while(next_char != "]"):
          processedInput+=next_char
          next_char=word_iterator.__next__()
        else:
          processedInput+=next_char
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.