Python: Iterando y modificando una lista

Objetivo: presentar técnicas de iteración sobre listas que permitan su modificación in-situ.

Comencemos planteando el siguiente problema: tenemos una lista de números y queremos modificarla de modo que almacene, en lugar del número en sí, su cuadrado.

No parece un problema complejo que no sepamos resolver con lo que ya conocemos:

lista = [1, 2, 3, 4, 5]

for elemento in lista:
    elemento = elemento * elemento
    print(elemento) # Una simple verificación

Si ahora observamos la salida:

>>> 
1
4
9
16
25

Aparenta todo haber ido de maravilla; sin embargo, nos encontramos con un pequeño detalle importante:

>>> lista
[1, 2, 3, 4, 5]

¡La lista no ha cambiado!

¿Cómo es posible? ¿Acaso no hemos comprobado como elemento, que ha pasado sucesivamente por todos y cada uno de los elementos de la lista, ha actualizado su valor a elemento * elemento?

Así es. Pero, lo que sucede, es que elemento no es más que una copia del valor original. Por muchos cambios que efectuemos sobre él no afectaran a la lista.

Necesitamos cambiar de estrategia.

Una forma de salvar el escollo sería reconstruir una lista temporal con los nuevos valores al cuadrado.

lista = [1, 2, 3, 4, 5]

lista_temp = []

for elemento in lista:
    elemento = elemento * elemento
    print(elemento)
    lista_temp.append(elemento)

La lista temporal, lista_temp es, en principio, una lista en blanco. Con cada iteración le agregamos el nuevo valor de elemento mediante el método append().

lista_temp ya tiene la solución buscada:

>>> lista
[1, 2, 3, 4, 5]
>>> lista_temp
[1, 4, 9, 16, 25]

Si lo necesitamos, podemos reasignar hacia dónde apunta lista:

>>> lista = lista_temp
>>> lista
[1, 4, 9, 16, 25]

En un nivel mayor de elegancia (en Python, la elegancia suele coincidir con el menor número de líneas de código), está la siguiente técnica: recorriendo el bucle for a través de el índice de la lista en vez de sus elementos. Es decir, como si fuera un bucle for típico de cualquier otro lenguaje de programación:

lista = [1, 2, 3, 4, 5]

for indice in range(len(lista)):
    lista[indice] = lista[indice] * lista[indice]
    print(lista[indice])

El resultado es el que esperamos:

>>> 
1
4
9
16
25
>>> lista
[1, 4, 9, 16, 25]

No solo la impresión es correcta, sino que la lista ha sido actualizada in-situ. Desde el bucle for, a través del índice, hemos podido acceder directamente a la lista, no a una copia de ella.

Apréndete bien esta técnica, pues es muy común. Itera sobre los elementos o los índices según tu necesidad concreta.

Date cuenta de que, para poder iterar a través de los índices, necesitamos conocer el número de elementos totales de la lista. Esto lo obtenemos con la expresión len(lista). Recuerda que la función len() nos devuelve el total de elementos de una secuencia. A continuación la función range() nos construye un iterable: range(len(lista)) facilitará al bucle for, sucesivamente, todos los valores enteros desde cero hasta uno menos que la longitud de la lista, precisamente el mismo rango que tienen sus índices.

Existe un nivel mayor de elegancia aún, las listas por comprensión, una de las construcciones más fascinantes y poderosas de Python. Son merecedoras de uno o varios artículos por separado, pero no me gustaría despedirme hoy sin que, al menos, y a modo de aperitivo, compruebes su potencia:

lista = [1, 2, 3, 4, 5]
lista = [elemento * elemento for elemento in lista]

Así de elegante:

>>> lista
[1, 4, 9, 16, 25]

Bienvenido a Python.

Javier Montero Gabarró


Python: Iterando y modificando una lista


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

4 opiniones en “Python: Iterando y modificando una lista”

  1. cuando almaceno en una lista con .appen me sale de esta manera[‘7′, ’54’] quisiera saber si se puede quitar las comillas para contar cuantas veces se repite n cosas en la lista con .count

    1. Las comillas te indican que lo que estás almacenando son strings, no enteros. Count sirve para cualquier tipo de datos. Naturalmente, será diferente contar las veces que se repite ‘7’, string, que las que lo hace 7 (entero). Por supuesto, siempre tienes la opción de convertir los strings a enteros con int() si te resulta más conveniente.
      Saludos

Deja un comentario