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?
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?
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()
)
Como nota, la iteración invertida se archiva con: para c en reversa ("cadena") –
¿De qué parte de la documentación sabe que una cadena es un tipo de iterador? – winklerrr
dir() una cadena..tu con el atributo ver __iter__. – shadow0359
Aún más fácil:
for c in "test":
print c
Después de un tiempo de pitón-ing, realmente estoy odiando C++ (estoy atrapado con él para un curso universitario actual!) – hasen
Respuesta inteligente y directa. :) – zgoda
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é? –
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
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). –
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
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
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
+1 para mostrar la opción de índice – dopplesoldner
thanx. obtener el índice era lo que estaba buscando –
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
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.
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
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.
por qué el downvote, no es "¿Cómo iterar sobre una cadena en Python?" una pregunta de programación perfectamente buena? – Jonas
Stackoverflow no es exclusivo para preguntas avanzadas. Upvoted. –
Estoy de acuerdo con Upchurch. He estado enseñando python con varios tutoriales web y no sabía que pudieras hacer esto. Upvoted. – mtruesdell