2009-02-11 18 views
386

En C++, lo que podía hacer:interactuando sobre una cadena

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

¿Cómo iterar sobre una cadena en Python?

+71

por qué el downvote, no es "¿Cómo iterar sobre una cadena en Python?" una pregunta de programación perfectamente buena? – Jonas

+144

Stackoverflow no es exclusivo para preguntas avanzadas. Upvoted. –

+12

Estoy de acuerdo con Upchurch. He estado enseñando python con varios tutoriales web y no sabía que pudieras hacer esto. Upvoted. – mtruesdell

Respuesta

309

Como Johannes señaló,

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

Se puede recorrer casi cualquier cosa en Python usando la construcción for loop,

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

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

Si eso parece mágico, bueno, es cierto, 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 que el bucle for trabaje en él.

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

See official documentation

+9

Como nota, la iteración invertida se archiva con: para c en reversa ("cadena") –

+0

¿De qué parte de la documentación sabe que una cadena es un tipo de iterador? – winklerrr

+0

dir() una cadena..tu con el atributo ver __iter__. – shadow0359

80

Aún más fácil:

for c in "test": 
    print c 
+10

Después de un tiempo de pitón-ing, realmente estoy odiando C++ (estoy atrapado con él para un curso universitario actual!) – hasen

+1

Respuesta inteligente y directa. :) – zgoda

+0

Soy un novato en Python. Por alguna razón, esto no se compila en mi entorno, y tuve que poner c entre corchetes para que funcione: 'para c en" prueba ": imprimir (c)' ¿Por qué? –

33

sólo para hacer una respuesta más amplia, la forma C de la iteración en 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é cuando las cadenas son intrínsecamente iterables?

for i in str: 
    print i 
+3

Volví a subir esto porque necesitaba saber cómo acceder al carácter i-ésimo (estoy acostumbrado a las iteraciones de cadenas de estilo Java/C). –

+6

En lugar de su primer bucle while, que puede hacer: for i in range (len (str)): de impresión (str [i]) que en mi opinión es mejor que tener que gestionar el contador en su propio . Aún mejor es la respuesta de marcog usando enumerate. – aiham

+1

Esto puede basarse 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. Entonces necesito encontrar un "0" y agarrarlo y los siguientes 3 caracteres, y seguir sin duplicar el número si hay otro 0 siguiéndolo. Ninguno de los métodos "for c in str" o "for i, c in enumerate (str)" funciona porque necesito el control del índice. Estoy seguro de que una expresión regular sería mucho mejor, sin embargo. – gkimsey

240

Si necesita acceder al índice como iterar a través de la cadena, utilice enumerate():

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

+1 para mostrar la opción de índice – dopplesoldner

+1

thanx. obtener el índice era lo que estaba buscando –

+3

Consejo profesional: comienza desde cero. Si necesita comenzar desde uno: '1 t',' 2 e', '3 s',' 4 t' use el parámetro "start": 'para i, c en enumerate ('test', start = 1) ' – Messa

2

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

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

Por ejemplo, aquí utilizo un enfoque lambda sencilla ya que todo lo que quiero hacer es una modificación trivial para el personaje: aquí, para incrementar cada valor de caracteres:

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

o más en general:

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

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

2

bien también se puede hacer algo interesante como esto y hacer su trabajo mediante el uso de bucle

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

respuesta es

M r. S uryaa

Sin embargo, desde gama() crear una lista de los valores que se secuencia por lo tanto se 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 remolque construido en funciones (BIFs en Comunidad Python)

1) Rango de() - 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 conocer la longitud de la cadena dada

1

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 los iterables de longitudes ampliamente variables pueden ser un problema, xrange es superior.

Cuestiones relacionadas