web-dev-qa-db-fra.com

Itérer chaque caractère dans une chaîne en utilisant Python

En C++, je peux effectuer une itération sur un std::string comme ceci:

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

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

Comment itérer sur une chaîne en Python?

482
Paradius

Comme l'a souligné Johannes,

for c in "string":
    #do something with c

Vous pouvez presque tout faire en python en utilisant la construction for loop,

par exemple, open("file.txt") renvoie un objet de fichier (et ouvre le fichier), en l'itérant itère sur les lignes de ce fichier.

with open(filename) as f:
    for line in f:
        # do something with line

Si cela semble magique, eh bien, c'est vrai, mais l'idée derrière cela est vraiment simple.

Il existe un protocole d'itérateur simple qui peut être appliqué à tout type d'objet pour que la boucle for fonctionne dessus.

Implémentez simplement un itérateur qui définit une méthode next() et implémentez une méthode __iter__ sur une classe pour la rendre itérable. (le __iter__ doit bien sûr renvoyer un objet itérateur, c'est-à-dire un objet qui définit next())

Voir la documentation officielle

405
hasen

Si vous avez besoin d'accéder à l'index pendant que vous parcourez la chaîne, utilisez enumerate() :

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

Encore plus facile:

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

Pour vous donner une réponse plus complète, la méthode C d’itération sur une chaîne peut s’appliquer en Python si vous voulez vraiment forcer une cheville carrée dans un trou rond.

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

Mais encore une fois, pourquoi faire cela quand les chaînes sont intrinsèquement itérables?

for i in str:
    print i
36
Andrew Szeto

Vous pouvez aussi faire quelque chose d’intéressant comme celui-ci et faire votre travail en utilisant for loop

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

La réponse est

M . S u y y a a

Cependant, puisque range () crée une liste de valeurs qui est séquence, vous pouvez donc utiliser directement le nom

for e in name:
    print(e)

Cela produit également le même résultat, est plus esthétique et s’applique à n’importe quelle séquence comme list, tuple et dictionary.

Nous avons utilisé des fonctions intégrées de remorquage (BIF dans la communauté Python)

1) range () - range () BIF est utilisé pour créer des index. Exemple

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

2) len () - len () BIF est utilisé pour déterminer la longueur d'une chaîne donnée

4
Mr. Suryaa Jha

Si vous souhaitez utiliser une approche plus fonctionnelle pour effectuer une itération sur une chaîne (peut-être pour la transformer d'une manière ou d'une autre), vous pouvez scinder la chaîne en caractères, appliquer une fonction à chacun d'eux, puis joindre la liste de caractères résultante à une chaîne.

Une chaîne est par nature une liste de caractères, par conséquent, "map" itérera sur la chaîne - en tant que deuxième argument - en appliquant la fonction - le premier argument - à chacun d'eux.

Par exemple, ici, j'utilise une approche lambda simple car tout ce que je veux faire est une modification triviale du caractère: ici, pour incrémenter chaque valeur de caractère:

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

ou plus généralement:

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

où my_function prend une valeur char et renvoie une valeur char.

3
MikeW

Plusieurs réponses ici utilisent rangename__. xrangeest généralement préférable, car il renvoie un générateur, plutôt qu'une liste entièrement instanciée. xrangeest supérieur.

2
N6151H

Vous pouvez utiliser des littéraux de chaîne formatés ( PEP498 ; Pyton 3.6+) avec print et le déballage de séquence et enumerate:

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

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

Si l'impression des valeurs Tuple est suffisante, l'expression du générateur n'est pas nécessaire:

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

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