Iterar sobre una cadena


En C++, puedo iterar sobre un std::string así:

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?

Author: Azeem, 2009-02-11

7 answers

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 file (y abre el archivo), iterando sobre él iterando sobre líneas en ese archivo

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

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

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

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

Véase la documentación oficial

 346
Author: hasen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 19:46:46

Si necesita acceso al índice mientras itera a través de la cadena, use enumerate():

>>> for i, c in enumerate('test'):
...     print i, c
... 
0 t
1 e
2 s
3 t
 270
Author: marcog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-28 16:54:32

Aún más fácil:

for c in "test":
    print c
 81
Author: Johannes Weiss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-02 16:19:13

Solo para hacer una respuesta más completa, la forma 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
 34
Author: Andrew Szeto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-17 05:36:55

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 uno y luego unir la lista resultante de caracteres en una cadena.

Una cadena es inherentemente una lista de caracteres, por lo tanto 'map' iterará sobre la cadena - como segundo argumento - aplicando la función - el primer argumento - a cada uno.

Por ejemplo, aquí utilizo un enfoque lambda simple ya que todo lo que quiero hacer es una modificación trivial al 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.

 2
Author: MikeW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-18 11:11:28

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

 2
Author: N6151H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-27 03:20:27

Bueno, también puedes hacer algo interesante como esto y hacer tu trabajo 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 respuesta es

M r . S u r y a a

Sin embargo, desde range () crear una lista de los valores que es la secuencia por lo que puede utilizar 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 Funciones tow Built in (BIFs 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 una cadena dada

 2
Author: Mr. Suryaa Jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-21 17:19:17