Iterando cada carácter en una cadena usando Python

En C ++, puedo iterar sobre una std::string como esta:

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

¿Cómo itero sobre una cadena en Python?

Como Johannes señaló,

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

Puedes iterar casi cualquier cosa en Python usando la construcción for loop ,

por ejemplo, open("file.txt") devuelve un objeto de archivo (y abre el archivo), iterando sobre él itera sobre las líneas en ese archivo

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

Si eso parece magia, bueno, lo es, pero la idea detrás de esto es realmente simple.

Hay un protocolo de iterador simple que se puede aplicar a cualquier tipo de objeto para hacer que el bucle for funcione en él.

Simplemente implemente un iterador que defina un método next() , e implemente un método __iter__ en una clase para hacerlo iterable. (el __iter__ por supuesto, debe devolver un objeto iterador, es decir, un objeto que define next() )

Ver documentación oficial.

Si necesita acceder al índice a medida que recorre la cadena, use enumerate() :

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

Aún más fácil:

 for c in "test": print c 

Solo para hacer una respuesta más completa, la forma en C de iterar sobre una cadena puede aplicarse en Python, si realmente quieres forzar una clavija cuadrada en un agujero redondo.

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

Pero, de nuevo, ¿por qué hacer eso cuando las cadenas son inherentemente iterables?

 for i in str: print i 

Bueno, también puedes hacer algo interesante como esto y hacer tu trabajo usando para bucle

 #suppose you have variable name name = "Mr.Suryaa" for index in range ( len ( name ) ): print ( name[index] ) #just like c and c++ 

La respuesta es

Señor . S uryaa

Sin embargo, dado que range () crea una lista de valores que es secuencia, puede usar directamente el nombre

 for e in name: print(e) 

Esto también produce el mismo resultado y también se ve mejor y funciona con cualquier secuencia como lista, tupla y diccionario.

Hemos utilizado arrastrar funciones incorporadas (BIF en la comunidad Python)

1) range () – range () BIF se usa para crear índices Ejemplo

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

2) len () – len () BIF se usa para averiguar la longitud de la cadena dada

Si desea utilizar un enfoque más funcional para iterar sobre una cadena (tal vez para transformarla de alguna manera), puede dividir la cadena en caracteres, aplicar una función a cada una y luego unir la lista resultante de caracteres en una cadena.

Una cadena es inherentemente una lista de caracteres, por lo tanto, ‘map’ se repetirá sobre la cadena, como segundo argumento, aplicando la función, el primer argumento, a cada una.

Por ejemplo, aquí utilizo un enfoque lambda simple, ya que todo lo que quiero hacer es una modificación trivial del carácter: aquí, para incrementar el valor de cada carácter:

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

o más generalmente:

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

donde my_function toma un valor char y devuelve un valor char.

Varias respuestas aquí usan range . xrange es mejor, ya que devuelve un generador, en lugar de una lista completamente instanciada. Donde la memoria y / o los iterables de diferentes longitudes pueden ser un problema, xrange es superior.

Puede usar literales de cadena con formato ( PEP498 ; Pyton 3.6+) con print y secuencia de desempaquetado y 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 los valores de tuple impresión son suficientes, no es necesario que la expresión del generador:

 print(*enumerate('Hello!'), sep='\n') (0, 'H') (1, 'e') (2, 'l') (3, 'l') (4, 'o') (5, '!')