web-dev-qa-db-ja.com

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

C++では、次のようにstd::stringを繰り返し処理できます。

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

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

Pythonで文字列を反復処理する方法

474
Paradius

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

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()を定義するオブジェクトを返すべきです)

公式文書を見る

401
hasen

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

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

さらに簡単に:

for c in "test":
    print c
86
Johannes Weiss

もっと包括的な答えを出すために、四角い止め釘を丸い穴に入れたいのであれば、文字列を反復処理するCの方法をPythonに適用することができます。

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

しかし、やはり、文字列が本質的に反復可能なときになぜそうなるのでしょうか。

for i in str:
    print i
35
Andrew Szeto

さて、あなたはまたこのような面白いことをすることができて、forループを使うことによってあなたの仕事をすることができます

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

答えは

氏 。サラリーマン

しかしrange()はsequenceである値のリストを作成するので、直接名前を使うことができます。

for e in name:
    print(e)

これも同じ結果を生み出し、見た目もよくなり、list、Tuple、dictionaryのような任意のシーケンスで機能します。

組み込み関数(Python CommunityのBIF)を2つ使用しました。

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

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

2)len() - len()BIFは与えられた文字列の長さを調べるのに使われます

4
Mr. Suryaa Jha

より機能的な方法で文字列を反復処理する(おそらく何らかの形で変換する)場合は、文字列を文字に分割し、それぞれに関数を適用して、結果の文字リストを文字列に戻すことができます。

文字列は本質的に文字のリストであるため、 'map'は文字列を2番目の引数として - 関数を適用して - 最初の引数としてそれぞれ繰り返します。

たとえば、ここでは単純なラムダアプローチを使用します。これは、各文字の値を増分するために、文字を簡単に変更するだけでよいからです。

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

もっと一般的には:

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

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

3
MikeW

ここでのいくつかの答えはrangeを使います。 xrangeは一般的に、完全にインスタンス化されたリストよりもジェネレータを返すのでより優れています。メモリや、さまざまな長さの反復可能変数が問題になる可能性がある場合は、xrangeが優れています。

2
N6151H

フォーマット済みの文字列リテラル( PEP498 ; Pyton 3.6以降)をprintとシーケンスアンパックおよびenumerateと一緒に使用できます。

print(*(f'{idx} {char}' for idx, char in enumerate('Hello!')), sep='\n')

0 H
1 e
2 l
3 l
4 o
5 !

Tupleの値を出力するだけで十分な場合、ジェネレータ式は必要ありません。

print(*enumerate('Hello!'), sep='\n')

(0, 'H')
(1, 'e')
(2, 'l')
(3, 'l')
(4, 'o')
(5, '!')
2
jpp