Question Itérer sur une ficelle


En C ++, je peux itérer sur un std::string comme ça:

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

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

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


416
2018-02-11 19:22


origine


Réponses:


Comme Johannes l'a souligné,

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

Vous pouvez itérer à peu près n'importe quoi en python en utilisant le for loop construction,

par exemple, open("file.txt") retourne un objet fichier (et ouvre le fichier), en le parcourant itère sur les lignes de ce fichier

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

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

Il y a un protocole d'itérateur simple qui peut être appliqué à n'importe quel type d'objet pour faire le for boucle de travail sur elle.

Implémentez simplement un itérateur qui définit un next() méthode, et mettre en œuvre un __iter__ méthode sur une classe pour la rendre itérable. (la __iter__ bien sûr, devrait retourner un objet itérateur, c'est-à-dire un objet qui définit next())

Voir la documentation officielle


335
2018-02-11 19:30



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

261
2017-12-28 16:54



Encore plus facile:

for c in "test":
    print c

81
2018-02-11 19:24



Juste pour faire 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 lorsque les chaînes sont intrinsèquement itérables?

for i in str:
    print i

34
2018-02-17 05:36



Si vous souhaitez utiliser une approche plus fonctionnelle pour itérer sur une chaîne (peut-être la transformer), vous pouvez diviser la chaîne en caractères, appliquer une fonction à chacun d'entre eux, puis réintégrer la liste de caractères dans une chaîne.

Une chaîne est intrinsèquement une liste de caractères, donc 'map' va itérer sur la chaîne - en second argument - en appliquant la fonction - le premier argument - à chacun.

Par exemple, ici j'utilise une approche lambda simple puisque 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ù ma_fonction prend une valeur de caractère et renvoie une valeur de caractère.


2
2017-12-18 11:11



Plusieurs réponses ici utilisent 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érations de longueurs très variables peuvent être un problème, xrange est supérieur.


2
2017-09-27 03:20



Eh bien, vous pouvez aussi faire quelque chose d'intéressant comme ça et faire votre travail en utilisant pour la boucle

#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 r y a a

Cependant, depuis range () créer une liste des valeurs qui est séquence, vous pouvez utiliser directement le nom

for e in name:
    print(e)

Cela produit également le même résultat et a également une meilleure apparence et fonctionne avec toutes les séquences telles que list, tuple et dictionary.

Nous avons utilisé tow Built in Functions (BIFs 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 connaître la longueur de la chaîne donnée


2
2018-05-20 14:18