Iterazione di ogni carattere in una stringa usando Python


517

In C ++, posso iterare su un std::stringsimile:

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

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

Come posso iterare su una stringa in Python?

Risposte:


441

Come ha sottolineato Johannes,

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

Puoi iterare praticamente qualsiasi cosa in Python usando il for loopcostrutto,

ad esempio, open("file.txt")restituisce un oggetto file (e apre il file), iterando su di esso scorre su righe in quel file

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

Se sembra magia, beh lo è, ma l'idea alla base è davvero semplice.

Esiste un semplice protocollo iteratore che può essere applicato a qualsiasi tipo di oggetto per far funzionare il forloop su di esso.

È sufficiente implementare un iteratore che definisce un next()metodo e implementare un __iter__metodo su una classe per renderlo iterabile. ( __iter__ovviamente, dovrebbe restituire un oggetto iteratore, ovvero un oggetto che definisce next())

Vedi la documentazione ufficiale


14
Come nota, l'iterazione inversa è archiviata con: for c in reversed ("stringa")
Akseli Palén

Da quale parte della documentazione sai che una stringa è di tipo iteratore?
winklerrr

dir () a string..you con l' attributo iter see .
shadow0359

312

Se è necessario accedere all'indice mentre si scorre la stringa, utilizzare enumerate():

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

9
Suggerimento: inizia da zero. Se è necessario avviarlo da uno: 1 t, 2 e, 3 s, 4 tutilizzare il parametro "start":for i, c in enumerate('test', start=1)
Messa

90

Ancora più semplice:

for c in "test":
    print c

Sono un principiante in Python. Per qualche motivo, questo non si compila nel mio ambiente e ho dovuto mettere c tra parentesi per farlo funzionare: for c in "test": print (c) Perché?
Mauro Vanetti,

7
@MauroVanetti è quasi certamente perché stai usando Python 3 e quando ho risposto alla domanda c'era AFAIK solo Python 2.
Johannes Weiss

37

Solo per dare una risposta più completa, il modo C di iterare su una stringa può essere applicato in Python, se vuoi davvero forzare un piolo quadrato in un foro rotondo.

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

Ma ancora una volta, perché farlo quando le stringhe sono intrinsecamente ripetibili?

for i in str:
    print i

6
Invece del tuo primo ciclo while, puoi fare: for i in range (len (str)): print (str [i]) che secondo me è meglio che dover gestire il contatore da solo. Ancora meglio è la risposta di marcog usando enumerate.
aiham,

1
Questo può essere basato sul fatto di aver usato C per così tanto tempo, ma quasi sempre finisco per usare questo metodo C-ish. Ad esempio, ho un file con alcuni numeri di 4 cifre sparsi, tutti che iniziano con 0. Quindi ho bisogno di trovare uno "0" e afferrarlo con i successivi 3 caratteri e andare avanti senza duplicare il numero se c'è un altro 0 che lo segue. Nessuno dei metodi "for c in str" o "for i, c in enumerate (str)" funziona perché ho bisogno del controllo dell'indice. Sono sicuro che un'espressione regolare sarebbe molto meglio, però.
gkimsey,

1
for i in range(len(...))è malvagio. In python 2.x, range()crea un elenco, quindi per un periodo molto lungo potresti finire con l'allocare un blocco di memoria molto grande. Almeno usare xrange()in quei casi. Inoltre, l'indicizzazione ripetuta della stessa stringa è molto più lenta rispetto all'iterazione diretta sulla stringa. Se è necessario l'indice, utilizzare enumerate().
Iizak,

6

Bene, puoi anche fare qualcosa di interessante come questo e fare il tuo lavoro usando 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 risposta è

Sig . Suryaa

Tuttavia poiché range () crea un elenco di valori che è sequenza, quindi è possibile utilizzare direttamente il nome

for e in name:
    print(e)

Questo produce anche lo stesso risultato e anche un aspetto migliore e funziona con qualsiasi sequenza come elenco, tupla e dizionario.

Abbiamo usato le funzioni integrate di rimorchio (BIF nella comunità Python)

1) range () - range () BIF è usato per creare indici Esempio

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

2) len () - len () BIF viene utilizzato per scoprire la lunghezza di una determinata stringa


4

Se desideri utilizzare un approccio più funzionale all'iterazione su una stringa (forse per trasformarla in qualche modo), puoi dividere la stringa in caratteri, applicare una funzione a ciascuna, quindi unire nuovamente l'elenco di caratteri risultante in una stringa.

Una stringa è intrinsecamente un elenco di caratteri, quindi 'map' ripeterà la stringa - come secondo argomento - applicando la funzione - il primo argomento - a ciascuno.

Ad esempio, qui uso un semplice approccio lambda poiché tutto ciò che voglio fare è una banale modifica al personaggio: qui, per aumentare il valore di ogni carattere:

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

o più in generale:

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

dove my_function accetta un valore char e restituisce un valore char.


2

Diverse risposte qui usano range. xrangeè generalmente migliore in quanto restituisce un generatore, piuttosto che un elenco completamente istanziato. Laddove la memoria e / o iterabili di lunghezze variabili possono essere un problema, xrangeè superiore.


1
nota che questo vale solo per Python 2, che si spera sia una minoranza in calo ora
Sam Mason,

0

Se ti capita di correre in una situazione in cui è necessario get the next char of the word using __next__(), ricordati di creare un string_iteratore iterare su di esso e non suoriginal string (it does not have the __next__() method)

In questo esempio, quando trovo un carattere = [continuo a cercare la parola successiva mentre non trovo ], quindi devo usare __next__

qui un ciclo for sulla stringa non sarebbe d'aiuto

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.