En C ++, puedo iterar sobre algo std::string
como 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?
Como señaló Johannes:
for c in "string":
#do something with c
Puedes iterar casi cualquier cosa en Python usando la for loop
construcció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 for
bucle 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()
)
Si necesita acceso al índice mientras recorre la cadena, use
enumerate()
:fuente
1 t
,2 e
,3 s
,4 t
utilizar el parámetro de "arranque":for i, c in enumerate('test', start=1)
Aún más fácil:
fuente
for c in "test": print (c)
¿por qué?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.
Pero, de nuevo, ¿por qué hacer eso cuando las cadenas son inherentemente iterables?
fuente
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 usoxrange()
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, useenumerate()
.Bueno, también puedes hacer algo interesante como esto y hacer tu trabajo usando for loop
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
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
2) len () - len () BIF se utiliza para averiguar la longitud de una cadena dada
fuente
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:
o más generalmente:
donde my_function toma un valor char y devuelve un valor char.
fuente
Varias respuestas aquí usan
range
.xrange
generalmente 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,xrange
es superior.fuente
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 unastring_iterator
e 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
fuente