Itération de chaque caractère d'une chaîne à l'aide de Python

517

En C ++, je peux itérer sur un std::stringcomme 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?

Paradius
la source

Réponses:

441

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 loopconstruction,

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 forboucle.

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())

Voir la documentation officielle

hasen
la source
14
A noter, l'itération inversée est archivée avec: pour c dans inversé ("string")
Akseli Palén
Dans quelle partie de la documentation savez-vous qu'une chaîne est de type itérateur?
winklerrr
dir () une chaîne..vous avec l' attribut see iter .
shadow0359
312

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
moinudin
la source
9
Conseil de pro: il part de zéro. Si vous devez démarrer d'un: 1 t, 2 e, 3 s, 4 tutilisez le paramètre « start »:for i, c in enumerate('test', start=1)
Messa
90

Encore plus simple:

for c in "test":
    print c
Johannes Weiss
la source
Je suis un débutant en Python. Pour une raison quelconque, cela ne se compile pas dans mon environnement, et j'ai dû mettre c entre parenthèses pour le faire fonctionner: for c in "test": print (c) pourquoi?
Mauro Vanetti
7
@MauroVanetti c'est presque certainement parce que vous utilisez Python 3 et quand j'ai répondu à la question, il n'y avait que AFAIK Python 2.
Johannes Weiss
37

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.

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

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

for i in str:
    print i
Andrew Szeto
la source
6
Au lieu de votre première boucle while, vous pouvez faire: pour i dans la plage (len (str)): print (str [i]) Ce qui, à mon avis, est mieux que d'avoir à gérer le compteur par vous-même. Encore mieux est la réponse de marcog en utilisant énumérer.
aiham
1
Cela peut être basé sur le fait d'avoir utilisé C pendant si longtemps, mais je finis presque toujours par utiliser cette méthode C-ish. Par exemple, j'ai un fichier avec des nombres à 4 chiffres dispersés, qui commencent tous par 0. Je dois donc trouver un "0" et le saisir ainsi que les 3 caractères suivants, et continuer sans dupliquer le numéro s'il y a un autre 0 le suit. Aucune des méthodes "for c in str" ou "for i, c in enumerate (str)" ne fonctionne car j'ai besoin du contrôle de l'index. Je suis sûr qu'une expression régulière serait cependant bien meilleure.
gkimsey
1
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 utiliser xrange()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, utilisez enumerate().
izak
6

Vous pouvez aussi faire quelque chose d'intéressant comme ça 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

Monsieur . S uryaa

Cependant, puisque range () crée une liste des valeurs qui est une séquence, vous pouvez donc 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 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

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

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

M. Suryaa Jha
la source
4

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:

>>> ''.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 char et renvoie une valeur char.

MikeW
la source
2

Plusieurs réponses sont utilisées ici range. xrangeest 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, xrangeest supérieur.

N6151H
la source
1
notez que cela ne s'applique qu'à Python 2 qui, espérons-le, est une minorité qui diminue maintenant
Sam Mason
0

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 un string_iteratoret 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

myString = "'string' 4 '['RP0', 'LC0']' '[3, 4]' '[3, '4']'"
processedInput = ""
word_iterator = myString.__iter__()
for idx, char in enumerate(word_iterator):
    if char == "'":
        continue

    processedInput+=char

    if char == '[':
        next_char=word_iterator.__next__()
        while(next_char != "]"):
          processedInput+=next_char
          next_char=word_iterator.__next__()
        else:
          processedInput+=next_char
Bernardo stearns reisen
la source