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?
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()
)
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
Encore plus facile:
for c in "test":
print c
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
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
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.
Plusieurs réponses ici utilisent range
name__. xrange
est généralement préférable, car il renvoie un générateur, plutôt qu'une liste entièrement instanciée. xrange
est supérieur.
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, '!')