Iterando cada caracter en una cadena usando Python

517

En C ++, puedo iterar sobre algo std::stringcomo esto:

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?

Paradius
fuente

Respuestas:

441

Como señaló Johannes:

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

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

por ejemplo, open("file.txt")devuelve un objeto de archivo (y abre el archivo), iterando sobre él itera sobre 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 iterador simple que se puede aplicar a cualquier tipo de objeto para que el forbucle funcione en él.

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

Ver documentación oficial

Hasen
fuente
14
Como nota, la iteración inversa se archiva con: for c in reverse ("string")
Akseli Palén
¿De qué parte de la documentación sabe que una cadena es un tipo de iterador?
winklerrr
dir () una cadena ... con el atributo see iter .
shadow0359
312

Si necesita acceso al índice mientras recorre la cadena, use enumerate():

>>> for i, c in enumerate('test'):
...     print i, c
... 
0 t
1 e
2 s
3 t
moinudin
fuente
99
Consejo profesional: comienza desde cero. Si necesita iniciarlo desde una: 1 t, 2 e, 3 s, 4 tutilizar el parámetro de "arranque":for i, c in enumerate('test', start=1)
Messa
90

Aún más fácil:

for c in "test":
    print c
Johannes Weiss
fuente
Soy un novato en Python. Por alguna razón, esto no se compila en mi entorno, y tuve que poner c entre paréntesis para que funcione: for c in "test": print (c) ¿por qué?
Mauro Vanetti
77
@MauroVanetti es casi seguro porque estás usando Python 3 y cuando respondí a la pregunta solo estaba AFAIK Python 2.
Johannes Weiss
37

Solo para hacer una respuesta más completa, la forma C de iterar sobre una cadena se puede aplicar 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
Andrew Szeto
fuente
66
En lugar de su primer ciclo while, puede hacer: for i in range (len (str)): print (str [i]) Lo que en mi opinión es mejor que tener que administrar el contador por su cuenta. Aún mejor es la respuesta de marcog usando enumerate.
aiham
1
Esto puede basarse simplemente en haber usado C durante tanto tiempo, pero casi siempre termino usando este método C-ish. Por ejemplo, tengo un archivo con algunos números de 4 dígitos dispersos, todos los cuales comienzan con 0. Así que necesito encontrar un "0" y agarrarlo y los siguientes 3 caracteres, y seguir adelante sin duplicar el número si hay otro 0 lo sigue. Ninguno de los métodos "for c in str" o "for i, c in enumerate (str)" funciona porque necesito el control del índice. Sin embargo, estoy seguro de que una expresión regular sería mucho mejor.
gkimsey
1
for i in range(len(...))es malvado En python 2.x, range()crea una lista, por lo que durante un período muy largo puede terminar asignando un bloque de memoria muy grande. Por lo menos uso xrange()en esos casos. Además, la indexación repetida de la misma cadena es mucho más lenta que iterar directamente sobre la cadena. Si necesita el índice, use enumerate().
izak
6

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

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 las funciones incorporadas de remolque (BIF en la comunidad de Python)

1) range () - range () BIF se utiliza para crear índices Ejemplo

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

2) len () - len () BIF se utiliza para averiguar la longitud de una cadena dada

Sr. Suryaa Jha
fuente
4

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 nuevamente 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í uso 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.

MikeW
fuente
2

Varias respuestas aquí usan range. xrangegeneralmente es 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, xrangees superior.

N6151H
fuente
1
tenga en cuenta que esto solo se aplica a Python 2, que con suerte es una minoría cada vez más reducida
Sam Mason
0

Si alguna vez se encuentra en una situación en la que necesita hacerlo get the next char of the word using __next__(), recuerde crear una string_iteratore iterar sobre ella y nooriginal string (it does not have the __next__() method)

En este ejemplo, cuando encuentro un char = [sigo buscando la siguiente palabra mientras no encuentro ], así que necesito usar __next__

aquí un bucle for sobre la cadena no ayudaría

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
fuente