En C ++, je peux itérer 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 parcourir une chaîne en Python?
Comme l'a souligné Johannes,
for c in "string":
#do something with c
Vous pouvez parcourir à peu près n'importe quoi en python en utilisant la for loop
construction,
par exemple, open("file.txt")
retourne un objet fichier (et ouvre le fichier), en itérant dessus 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 un peu, mais l'idée derrière c'est vraiment simple.
Il existe un protocole d'itérateur simple qui peut être appliqué à n'importe quel type d'objet pour faire fonctionner la for
boucle.
Implémentez simplement un itérateur qui définit une next()
méthode et implémentez une __iter__
méthode sur une classe pour la rendre itérable. (le __iter__
bien sûr, devrait retourner 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()
:la source
1 t
,2 e
,3 s
,4 t
utilisez le paramètre « start »:for i, c in enumerate('test', start=1)
Encore plus simple:
la source
for c in "test": print (c)
pourquoi?Juste pour faire une réponse plus complète, la manière C d'itérer sur une chaîne peut s'appliquer en Python, si vous voulez vraiment forcer une cheville carrée dans un trou rond.
Mais là encore, pourquoi faire cela quand les chaînes sont intrinsèquement itérables?
la source
for i in range(len(...))
est mauvais. En python 2.x,range()
crée une liste, donc pour une très longue durée, vous pouvez finir par allouer un très grand bloc de mémoire. À tout le moins utiliserxrange()
dans ces cas. En outre, l'indexation répétée de la même chaîne est beaucoup plus lente que l'itération directement sur la chaîne. Si vous avez besoin de l'index, utilisezenumerate()
.Vous pouvez aussi faire quelque chose d'intéressant comme ça et faire votre travail en utilisant for loop
La réponse est
Monsieur . S uryaa
Cependant, puisque range () crée une liste des valeurs qui est une séquence, vous pouvez donc utiliser directement le nom
Cela produit également le même résultat et a également une meilleure apparence et fonctionne avec n'importe quelle séquence comme la liste, le tuple et le dictionnaire.
Nous avons utilisé les fonctions intégrées de remorquage (BIF dans la communauté Python)
1) range () - range () BIF est utilisé pour créer des index Exemple
2) len () - len () BIF est utilisé pour trouver la longueur d'une chaîne donnée
la source
Si vous souhaitez utiliser une approche plus fonctionnelle pour itérer sur une chaîne (peut-être pour la transformer d'une manière ou d'une autre), vous pouvez diviser la chaîne en caractères, appliquer une fonction à chacun, puis rejoindre la liste résultante de caractères en une chaîne.
Une chaîne est intrinsèquement une liste de caractères, donc 'map' itérera sur la chaîne - comme deuxième argument - en appliquant la fonction - le premier argument - à chacun.
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:
ou plus généralement:
où ma_fonction prend une valeur char et renvoie une valeur char.
la source
Plusieurs réponses sont utilisées ici
range
.xrange
est généralement meilleur car il renvoie un générateur, plutôt qu'une liste entièrement instanciée. Là où la mémoire et / ou les itérables de longueurs très variables peuvent être un problème,xrange
est supérieur.la source
Si vous courez dans une situation où vous en avez besoin
get the next char of the word using __next__()
, n'oubliez pas de créer unstring_iterator
et itérer dessus et nonoriginal string (it does not have the __next__() method)
Dans cet exemple, lorsque je trouve un char =
[
je continue de chercher le mot suivant pendant que je ne le trouve pas]
, donc je dois utiliser __next__ici une boucle for sur la chaîne ne serait pas utile
la source