Texto 5 Iteración For in
Texto 5 Iteración For in
En Python existen tipos de datos que se componen de otros datos. Entre estos se encuentran las
listas o arreglos.
Las listas son un tipo de dato que permiten almacenar un grupo de datos de distintos tipo. Por
ejemplo: números enteros, flotantes, caracteres, strings e incluso otras listas.
Las listas se declaran utilizando corchetes ([ ]) y separando cada uno de los elementos por una
coma (,).
A continuación se muestra un ejemplo de una lista que almacena tres valores enteros 1, 2 y 3:
lista_numerica = [1, 2, 3]
lista_numerica
[1, 2, 3]
[8, 11, 3]
Dependiendo del problema a resolver, a veces será necesario inicializar listas sin elementos, es
decir, listas vacías. Para ello se declara la lista utilizando solamente corchetes, como se
ejemplifica aquí:
lista_vacia = []
lista_vacia
[]
En particular las listas vacías se usan para luego ir agregándole elementos dentro de un
programa.
Vale destacar que a nivel interno, para Python una lista es solo una colección ordenada de
elementos, por lo que estos no tienen que tener el mismo tipo:
lista_ejemplo = [1, 1.2, "hola"]
lista_ejemplo
Indexación
Al igual que los strings, es posible acceder a los elementos de una lista usando sus índices.
En el caso de las listas cada uno de sus elementos posee un índice partiendo desde el 0 hasta
l e n ( li s t a ) −1. Por ejemplo, la lista_posiciones, que tiene los elementos del 100 al 108 y un
l e n ( l i s t a p o s i c i o n e s )=9 .
lista_posiciones = [100, 101, 102, 103, 104, 105, 106, 107, 108]
105
lista[indice]
IMPORTANTE: Uno de los errores más comunes al trabajar con listas es el error
IndexError: list index out of range el cuál aparece cuando estoy intentando
acceder a una posición más allá de los elementos de la lista. Por ejemplo:
lista_posiciones[9]
----------------------------------------------------------------------
-----
IndexError Traceback (most recent call
last)
<ipython-input-68-2970a78df483> in <cell line: 1>()
----> 1 lista_posiciones[9]
Esto nos permite agregarle, quitarle o modificar elementos, sin tener que borrar la lista entera y
guardarla nuevamente en una variable.
[1, 2, 100, 4, 5]
Al igual que al consultar por un elemento de la lista, si queremos modificar algun valor, este
debe existir, de no ser así, Python también entregará el mensaje de error list index out of
range indicándonos que queremos modificar una posición que no existe realmente en la lista.
----------------------------------------------------------------------
-----
IndexError Traceback (most recent call
last)
<ipython-input-70-f97b59a50231> in <cell line: 5>()
3
4 # Se accede a la posición deseada para asignar un nuevo valor
----> 5 lista_ejemplo2[7]= 8
6
7 # Se muestra por pantalla la lista con su valor actualizado
1. Función list()
2. Agregar elementos
3. Obtener la cantidad de elementos
4. Cambiar/actualizar un valor
5. Eliminar elementos
6. Cortar (Slicing)
7. Concatenar
8. Repetir
9. Cambiar varios valores
1. Funcion list()
Una forma de crear, o definir, una lista vacía es utilizando la función nativa list(). La función
list() recibe como entrada un valor que debe ser "iterable" (por ejemplo, otra lista o un string)
para poder generar una lista.
lista_ejemplo = list()
lista_ejemplo
[]
En el ejemplo se observa que al utilizar la función list() sin argumentos (datos de entrada), se
genera una lista vacía.
['H', 'o', 'l', 'a', ' ', 'm', 'u', 'n', 'd', 'o']
Del mismo modo se observa que al ingresar un string (elemento iterable) a la función list(),
este genera una lista donde cada elemento de ella es la mínima unidad en la que se puede dividir
un string (caracteres).
Si intento utilizar la función de cambio de tipo sobre un elemento que no es iterable obtendré un
error, pues Python no sabe como resolver esta conversión. Por ejemplo:
lista = list(10)
print(lista)
----------------------------------------------------------------------
-----
TypeError Traceback (most recent call
last)
<ipython-input-85-a9ed6e10255a> in <cell line: 1>()
----> 1 lista = list(10)
2 print(lista)
2. Agregar Elementos
Para poder agregar elementos a una lista, Python provee de un método denominado
.append(), el cual agrega un elemento al final de la lista que lo usa.
lista_numeros = [1, 2, 3]
lista_numeros.append(4)
lista_numeros
[1, 2, 3, 4]
lista_numeros_2 = [1, 2, 3]
lista_numeros_2.append("hola_mundo")
lista_numeros_2
[1, 2, 3, 'hola_mundo']
Vale la pena recordar que los métodos dependen del objeto sobre el cuál se está trabajando. En
particular, el método .append() modifica internamente la lista, por lo que no devuelve nada.
Un error común es asignar la lista nuevamente al resultado de .append(), sin embargo, esto
genera que la lista completa sea eliminada, como se muestra a continuación:
lista_numeros_2 = [1, 2, 3]
lista_numeros_2 = lista_numeros_2.append("hola_mundo")
print(lista_numeros_2)
None
En este caso, al usar print(), vemos que retorna None, esto nos está indicando que en la
variable lista_numeros_2, no existe nada, pues el uso incorrecto de .append() eliminó toda
la lista.
Cuando lo usamos con las listas, nos indica la cantidad de elementos que esta posee:
lista_vacia = []
len(lista_vacia)
0
lista_numeros = [1, 2, 3]
len(lista_numeros)
Si los elementos de la lista fuesen otras listas. Al usar len(), la función nos devolvería
únicamente la cantidad de elementos de la lista principal, sin considerar los elementos de sus
sublistas.
Por ejemplo:
lista = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
len(lista)
4. Cambiar/actualizar un valor
Como vimos previamente, actualizar o modificar un valor de una lista determinada, se debe
acceder a la posición deseada por medio de la indexación y se utiliza el operador asignación:
5. Eliminar elementos
Es posible eliminar elementos de una lista a través de su posición utilizando el método .pop(),
este método recibe una posición, elimina el elemento de dicha posición y lo retorna. En caso de
que no se indique una posición, el método eliminará el último elemento de la lista. Por ejemplo:
[1, 2, 3, 4, 5, 6]
5
lista_numeros = [1, 2, 3, 4, 5, 6, 10]
[1, 2, 3, 4, 5, 6]
Cabe destacar que, si la posición dada es inválida, pop generará el error IndexError. Por
ejemplo:
----------------------------------------------------------------------
-----
IndexError Traceback (most recent call
last)
<ipython-input-95-ba49050953ae> in <cell line: 4>()
2
3 # Trato de eliminar un elemento que no existe
----> 4 lista_numeros.pop(12)
6. Cortar (Slicing)
Una lista puede ser cortada para extraer parte de su contenido, generando una nueva lista. Para
realizar la acción anterior se debe indicar los rangos de datos a copiar.
lista[posicion_inicial:posicion_final:salto]
Al igual que la función range(), es posible omitir parámetros al utilizar el operador de corte.
Cabe destacar que al generar una nueva lista con las posiciones indicadas, la lista original NO se
modifica, solo se crea una nueva lista (copia).
[6, 10]
En este caso Python generará una lista desde la primera posición (posición 0) hasta la posición
indicada. En el caso particular del ejemplo, se copian los datos de la lista que se encuentran en
los índices 0, 1, 2, 3, 4 y 5.
Si no se ingresa una posición final, Python generará una lista desde la posición indicada (6) hasta
la posición final. En el caso particular del ejemplo, se copian los datos de la lista que se
encuentran en los índices 6, 7, 8 y 9.
Finalmente si no se ingresa una posición inicial ni una posición final, pero si un salto, Python
generará una copia de la lista pero con saltos de elementos, omitiendo los índices 1, 3, 5, 7 y 9.
7. Concatenar
Al igual que con los strings, es posible unir los elementos de 2 listas usando el operador de
concatenación(+).
En este caso, la concatenación de 2 listas se traduce en colocar los elementos de la lista_2
después de los elementos de la lista_1.
lista_1 = [1, 2, 3]
lista_2 = [9, 8, 7]
[1, 2, 3, 9, 8, 7]
lista_1 = [1, 2, 3]
lista_1 = lista_1 + [9, 8, 7]
lista_1
[1, 2, 3, 9, 8, 7]
8. Repetir
Adicionalmente, también es posible utilizar la repetición en listas, utilizando el operador (*).
Esta operación repite una cierta cantidad de veces la lista, concatenándola consigo misma.
Por ejemplo:
lista_numeros = [1, 2, 3, 4]
lista_repetida = lista_numeros*3
lista_repetida
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
Por ejemplo:
lista_numerica = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
lista_numerica[2:6] = [1, 1, 1, 1]
lista_numerica
Vale la pena destacar que al hacer este tipo de asignaciones, es necesario que el tipo de dato que
se va a asignar también sea una lista.
Esta lista, sin embargo, no tiene la obligación de ser del mismo largo. Por ejemplo:
Más métodos
Debido a la utilidad que tienen las listas para ayudar en la resolución de problemas, existe una
amplia variedad de funciones y métodos para operar sobre ellas.
Iteraciones en Listas
Es común que a la hora de resolver un problema, tengamos que recorrer utilizando iteración las
listas, ya sea para mostrar sus valores, ir modificándolos o para cualquier otro propósito que el
problema determine.
Cómo ya conocemos dos estructuras de control de iteración: while y for-in. Vale la pena
mencionar ambas.
Para ilustrar esto, consideremos que tenemos una lista de números guardados como string y
queremos transformar a enteros.
lista_enteros = int(lista_enteros)
Pues arrojaría un TypeError. Sin embargo, podríamos usar while, para hacerlo elemento a
elemento.
Si recordamos lo que vimos de for-in, si lo usamos para hacer el mismo procedimiento, este no
cambiaría la lista, sino que haría solo el cambio sobre la variable usada para iterar. Por ejemplo:
for e in lista_enteros:
e = int(e)
print(lista_enteros)
Como se puede ver, esto no cambia la lista, porque si bien la variable e es transformada paso a
paso, esta transformación ocurre sobre una copia del valor y no sobre el elemento de la lista.
Si quisiéramos cambiar los valores usando for-in, podríamos recorrer por posiciones usando
range(). Por ejemplo:
print(lista_enteros)
suma = 0
for e in lista_enteros:
e = int(e)
suma = suma + e
print(suma)
48
En este caso, como no era de interés para el problema cambiar los elementos de la lista a
enteros. Transforme en cada paso la variable e, para luego acumular el resultado en la variable
suma.
Listas de listas
Cómo vimos, las listas pueden componerse de cualquier elemento, por lo que es posible (y
común) declarar una lista que tenga como elementos en su interior otras listas o sublistas. Por
ejemplo:
sub_lista_1 = [1,0,1]
sub_lista_2 = [1,1,0]
sub_lista_3 = [0,1,1]
También podemos definirlo todo directamente en una sentencia. Aunque hay que considerar el
balanceo de paréntesis.
Del mismo modo, Python acepta saltos de línea, sin cambiar el contenido de la lista:
lista = [
[1, 0, 1],
[1, 1, 0],
[0, 1, 1]
]
print(lista)
lista_de_listas = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
12
4
Esta misma sintaxis se puede usar para modificar los elementos de las sublistas. Por ejemplo:
lista_de_listas = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
print(lista_de_listas)
El entender que las listas pueden componerse de otras y usarlo de forma creativa para resolver
problemas es indispensable para generar abstracciones de datos complejas, pues con
composiciones de listas puedo:
Por ejemplo, la lista pixels del ejemplo a continuación, tiene 5 filas con 3 pixeles del mismo
color cada una.
• La primera fila es de color negro.
• La segunda es de color blanco.
• La tercera es de color rojo.
• La cuarta es de color verde.
• La quinta es azul.
En cada una, cada pixel está representado como una lista de 3 elementos, con valores entre 0 y
255.
Si bien el código es un poco más avanzado de lo que estamos viendo ahora mismo, es un buen
ejemplo de lo que es posible hacer con listas de listas. ¡Y con pocas líneas de código!
# Creo la imagen
new_image = Image.fromarray(array)
# Como la imagen es de 3x5, es muy pequeña para verla, por lo que la
agrandamos
new_image = new_image.resize((300,500), Image.NONE)
# Mostramos la imagen resultante
new_image.show()
Listas como referencias
Como ya podemos suponer, una lista puede tener cantidades gigantescas de elementos. Por
ejemplo, si almacenaramos un fondo de pantalla de resolución 1920 ×1080 como una lista en
Python, tendríamos 6.220 .800 de elementos. Es por ello, que a la hora de crear copias sobre
listas, estas funcionan de una forma totalmente distinta a lo que hemos visto hasta ahora.
lista_2[0] = 220
print(lista_1)
print(lista_2)
[220, 2, 3]
[220, 2, 3]
Esto ocurre porque a diferencia de lo que vimos con los tipos de datos anteriores (boolean,
int, float, complex y string), al usar el operador de asignación sobre una lista, estamos
creando solamente una referencia (o puntero) a la misma, en vez de una copia de los valores.
En términos sencillos, lista_2 no es una copia nueva de la lista_1, sino que es un nuevo
nombre para el mismo elemento. En este caso, la lista con los elementos [220, 2, 3] posee
dos nombres, lista_1 y lista_2.
Esto se debe a que, como Python no sabe de antemano la cantidad de elementos que podría
tener una lista, el hacer una copia de ella, podría significar un incremento explosivo del uso de
memoria por un programa.
Si queremos una copia con los valores, que no sea una referencia a la misma, debemos usar el
método .copy(). Por ejemplo:
lista_1 = [1, 2, 3]
lista_2 = lista_1.copy()
lista_2[0] = 220
print(lista_1)
print(lista_2)
[1, 2, 3]
[220, 2, 3]
En este caso, podemos ver que al modificar lista_2, como ahora es una nueva lista y no una
referencia, sus modificaciones no afectan a la lista_1.
Referencias circulares
Otro problema que puede ocurrir por no considerar esta propiedad de las listas, es la creación de
referencias circulares. Por ejemplo:
lista_1 = [1,2,3]
lista_1[0] = lista_1
print(lista_1)
[[...], 2, 3]
En este caso, el primer elemento de la lista_1 es una referencia a si misma. Lo que implica que la
lista está conteniéndose a si misma.
lista_1[0]
[[...], 2, 3]
Si vamos más en profundidad, veremos que el primer elemento de cada sublista, es exactamente
la misma lista.
lista_1[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]
[[...], 2, 3]
Esto implica que al modificar ese elemento, eliminamos toda esta cadena de referencias. Por
ejemplo:
print(lista_1)
Si bien, las referencias circulares no son comunes, puede ser que producto de una mala
implementación nos aparezca una de ellas. En cuyo caso, depurando el código podríamos
corregir el problema.
• En primer lugar, vale la pena explorar que hace la función de cambio de tipo: list()
sobre un string:
texto_como_lista = list('Woosh ahora sere una lista')
print(texto_como_lista)
['W', 'o', 'o', 's', 'h', ' ', 'a', 'h', 'o', 'r', 'a', ' ', 's', 'e',
'r', 'e', ' ', 'u', 'n', 'a', ' ', 'l', 'i', 's', 't', 'a']
Como vemos, el problema es que cuando hacemos esta conversión nos genera una lista donde
cada caracter es un elemento.
Pero a veces queremos una lista separando por palabra, por línea u otro elemento. En ese caso,
es mejor usar el método de los strings .split(substring).
Este método retorna una lista, donde cada elemento es el string separado por el substring
entregado como parámetro. Por ejemplo:
A partir de ambos ejemplos podemos ver que .split() usa el caracter como punto de corte
del string. En el primer caso, ocupamos el caracter espacio ' ' y luego ocupamos el caracter
'o'.
print(texto)
['Ho', ' ho', ' ho', ' ho', ' ho', ' ho', ' ho', '']
En este caso usamos el substring 'la' para hacer el corte. Es importante notar que .split()
solo recibe un único substring como caracter de corte. Por lo que si quisiera usar más de uno
(Como por ejemplo, separar por espacios y saltos de línea) necesitaría escribir algún
procedimiento especial para ello. Del mismo modo, usar .split() consecutivos no sirve, pues
en el siguiente paso, no tendremos un string al cuál aplicarle el método, sino que será una lista.
Por lo que al intentarlo nos entregará un error:
----------------------------------------------------------------------
-----
AttributeError Traceback (most recent call
last)
<ipython-input-10-33a999d8573e> in <cell line: 5>()
3 print(texto)
4 # La siguiente línea provoca el error
----> 5 texto = texto.split(' ')
Como se puede ver, nos dice que no podemos usar .split(), un método de los objetos de la
clase string sobre un objeto de la clase list.
Por otro lado, si intento hacer el proceso inverso. Es decir, de convertir una lista a un string.
También tendremos problemas:
print(lista_como_string)
En este caso es más difícil de ver, pero en la variable lista_como_string ahora está
almacenado el string '['Woosh', 'ahora', 'soy', 'una', 'lista']', con comas,
espacios y puntos y coma incluidos. Podemos verlo en el siguiente ciclo, donde se imprime
caracter a caracter:
Del mismo modo que existía el .split() en los string para transformar a list, existe un
método de la misma clase que recibe una lista y la une en un solo string de manera más
amigable. Este método es .join(list).
El método une todos los ítems en un elemento iterable (en este caso una lista) y los une usando
un separador. La sintaxis de uso es separador.join(elemento iterable). Por ejemplo:
print(lista_como_string_v1)
Como se puede observar, el método .join() utiliza el substring separador y lo usa para
concatenar todos los elementos de la lista. En el primer caso, lo hace usando el caracter espacio
(' ') y en el segundo caso usando el substring 'SEP'.
Es importante destacar que para que el método funcione correctamente todos los elementos de
la lista deben ser de tipo string. De lo contrario, el programa arrojará un error:
lista = [1, 2, 3, 4, 5]
print(texto)
----------------------------------------------------------------------
-----
TypeError Traceback (most recent call
last)
<ipython-input-9-c48e02b8aa90> in <cell line: 4>()
2
3 #Esta línea genera el error
----> 4 texto = ' '.join(lista)
5
6 print(texto)
De todos modos, si tenemos este caso, siempre es posible utilizar un ciclo para convertir todos
los elementos a string para luego usar el método. El construirlo es trivial, pero se deja una
implementación a continuación:
lista = [1, 2, 3, 4, 5]
print(texto)
1 2 3 4 5
Consideraciones finales
A la hora de trabajar con listas, siempre es bueno tener presente el principio de que siempre es
más sencillo crear una lista nueva que modificar una existente. Por lo que a veces cuando en un
ejercicio nos pidan alguna modificación sobre una lista, siempre es bueno considerar si vale la
pena mover elementos internamente o crear una copia con la cuál trabajar.
Por ejemplo: Si el problema fuese ordene una lista de menor a mayor. El algoritmo más sencillo
para implementar una solución a este problema consiste en agregar cada elemento
ordenadamente a una lista vacía y luego eliminarlo de la lista original. Las soluciones que
mueven elementos dentro de la lista son factibles pero más complejas.
Bibliografía
Listas
Ceder, V. L. (2010). Lists, Tuples and Sets. En The Quick Python Book (2.a ed., p. 186). Manning
Publications.
Python Software Foundation. (2022, 4 agosto). Data Structures. Python 3.10.6 documentation.
Recuperado 4 de agosto de 2022, de https://docs.python.org/3/tutorial/datastructures.html