Saltar al contenido
🐍 Curso de Python
/

Módulo 1 · Lección 21 de 59

Modificar listas

Las listas sí se pueden cambiar: añadir, insertar, sustituir y quitar elementos sin crear una lista nueva.

⏱ 13 min de lectura

Cuando intentaste cambiar una letra de una cadena, Python te lo prohibió: las cadenas son inmutables y la única salida era construir una cadena nueva. Con las listas ocurre justo lo contrario. Una lista se puede tocar por dentro tantas veces como quieras, y esa es la razón principal de que exista.

Se dice que las listas son mutables. Tiene consecuencias buenas, que verás ahora, y una trampa importante, que verás en la lección de las copias.

Cambiar un elemento por su índice#

Se asigna igual que a una variable, pero con el índice delante:

python
tareas = ["comprar pan", "llamar al banco", "regar plantas"]

tareas[1] = "llamar al banco (hecho)"

print(tareas)
Salida en pantalla
['comprar pan', 'llamar al banco (hecho)', 'regar plantas']

No se ha creado ninguna lista nueva: es la misma lista, con la posición 1 ocupada por otro valor. Compara con lo que pasaba en las cadenas:

python
palabra = "Python"
palabra[0] = "J"
Salida en pantalla
TypeError: 'str' object does not support item assignment

Ese error no existe en las listas. tareas[0] = "otra cosa" simplemente funciona.

Añadir al final: append#

Es el método que más vas a usar en tu vida con Python. Añade un elemento al final de la lista:

python
carrito = []

carrito.append("leche")
carrito.append("huevos")
carrito.append("café")

print(carrito)
print(len(carrito))
Salida en pantalla
['leche', 'huevos', 'café']
3

El patrón "lista vacía más append dentro de un bucle" es la forma estándar de construir una lista a partir de otra cosa:

python
cuadrados = []

for numero in range(1, 6):
        cuadrados.append(numero ** 2)

print(cuadrados)
Salida en pantalla
[1, 4, 9, 16, 25]

Insertar en una posición: insert#

insert(posicion, valor) coloca el elemento en ese índice y empuja el resto hacia la derecha:

python
cola = ["Ana", "Luis", "Marta"]

cola.insert(0, "Pedro")      # al principio
cola.insert(2, "Sara")       # en la tercera posición

print(cola)
Salida en pantalla
['Pedro', 'Ana', 'Sara', 'Luis', 'Marta']

Si la posición se sale de la lista, insert no falla: pega el elemento al extremo más cercano. cola.insert(500, "Juan") lo pone al final, igual que append.

Añadir varios: extend#

extend recibe otra colección y mete sus elementos uno a uno al final:

python
invitados = ["Ana", "Luis"]
nuevos = ["Marta", "Pedro"]

invitados.extend(nuevos)

print(invitados)
Salida en pantalla
['Ana', 'Luis', 'Marta', 'Pedro']

La diferencia entre append y extend#

Es la confusión número uno con las listas, y se entiende de golpe viéndolas juntas:

python
con_append = ["Ana", "Luis"]
con_extend = ["Ana", "Luis"]

con_append.append(["Marta", "Pedro"])
con_extend.extend(["Marta", "Pedro"])

print(con_append)
print(len(con_append))
print(con_extend)
print(len(con_extend))
Salida en pantalla
['Ana', 'Luis', ['Marta', 'Pedro']]
3
['Ana', 'Luis', 'Marta', 'Pedro']
4

append añade un elemento, sea lo que sea; si le das una lista, mete la lista entera como un solo elemento y acabas con una lista dentro de otra. extend añade los elementos de lo que le pases.

QuieresUsaResultado sobre [1, 2] con [3, 4]
Añadir un elementoappend[1, 2, [3, 4]]
Añadir varios elementosextend[1, 2, 3, 4]

Quitar por valor: remove#

remove busca el valor y borra la primera aparición:

python
colores = ["rojo", "verde", "azul", "verde"]

colores.remove("verde")

print(colores)
Salida en pantalla
['rojo', 'azul', 'verde']

Solo ha desaparecido el primer "verde". El segundo sigue ahí.

Quitar por posición: pop#

pop es distinto de todos los demás: borra el elemento y te lo devuelve, así que puedes trabajar con él.

python
pila = ["primero", "segundo", "tercero"]

ultimo = pila.pop()        # sin argumento: el último
print(ultimo)
print(pila)

primero = pila.pop(0)      # con índice
print(primero)
print(pila)
Salida en pantalla
tercero
['primero', 'segundo']
primero
['segundo']

Esa doble función lo hace ideal para procesar una lista hasta vaciarla:

python
pendientes = ["revisar correo", "llamar al banco", "comprar pan"]

while pendientes:
        tarea = pendientes.pop(0)
    print(f"Haciendo: {tarea} (quedan {len(pendientes)})")

print("Todo hecho.")
Salida en pantalla
Haciendo: revisar correo (quedan 2)
Haciendo: llamar al banco (quedan 1)
Haciendo: comprar pan (quedan 0)
Todo hecho.

El while pendientes: se apoya en que una lista vacía es falsa: el bucle acaba solo cuando no queda nada.

Quitar con del#

del no es un método, es una instrucción del lenguaje. Borra por índice y no devuelve nada:

python
numeros = [10, 20, 30, 40, 50]

del numeros[0]
print(numeros)

del numeros[1:3]        # también borra rebanadas
print(numeros)
Salida en pantalla
[20, 30, 40, 50]
[20, 50]

Usa pop cuando quieras el elemento que quitas y del cuando solo quieras que desaparezca.

Vaciar la lista: clear#

python
temporal = [1, 2, 3, 4]

temporal.clear()

print(temporal)
print(len(temporal))
Salida en pantalla
[]
0

Unir y repetir listas#

Los operadores + y * funcionan igual que en las cadenas, y a diferencia de los métodos anteriores no modifican nada: crean una lista nueva.

python
turno_manana = ["Ana", "Luis"]
turno_tarde = ["Marta", "Pedro"]

todos = turno_manana + turno_tarde
print(todos)
print(turno_manana)          # intacta

print([0] * 5)
print(["-"] * 3 + ["|"])
Salida en pantalla
['Ana', 'Luis', 'Marta', 'Pedro']
['Ana', 'Luis']
[0, 0, 0, 0, 0]
['-', '-', '-', '|']

[0] * 5 es la forma habitual de crear una lista de un tamaño fijo ya inicializada, por ejemplo un contador por cada día de la semana.

Resumen de los métodos#

MétodoQué haceDevuelve
lista[i] = xSustituye la posición i—
lista.append(x)Añade x al finalNone
lista.insert(i, x)Inserta x en la posición iNone
lista.extend(otra)Añade los elementos de otraNone
lista.remove(x)Borra la primera aparición de xNone
lista.pop()Borra y devuelve el últimoEl elemento
lista.pop(i)Borra y devuelve el de la posición iEl elemento
del lista[i]Borra la posición i—
lista.clear()Deja la lista vacíaNone
lista + otraLista nueva con las dosLa lista nueva
lista * nLista nueva repetida n vecesLa lista nueva

Un ejemplo completo#

inventario.py
inventario = ["tornillos", "tuercas", "clavos"]
print(f"Inicial:    {inventario}")

inventario.append("arandelas")
inventario.insert(0, "martillos")
print(f"Ampliado:   {inventario}")

if "clavos" in inventario:
        inventario.remove("clavos")
print(f"Sin clavos: {inventario}")

retirado = inventario.pop()
print(f"Retirado:   {retirado}")
print(f"Final:      {inventario} ({len(inventario)} artículos)")
Salida en pantalla
Inicial:    ['tornillos', 'tuercas', 'clavos']
Ampliado:   ['martillos', 'tornillos', 'tuercas', 'clavos', 'arandelas']
Sin clavos: ['martillos', 'tornillos', 'tuercas', 'arandelas']
Retirado:   arandelas
Final:      ['martillos', 'tornillos', 'tuercas'] (3 artículos)