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.
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:
tareas = ["comprar pan", "llamar al banco", "regar plantas"]
tareas[1] = "llamar al banco (hecho)"
print(tareas)['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:
palabra = "Python"
palabra[0] = "J"TypeError: 'str' object does not support item assignmentEse 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:
carrito = []
carrito.append("leche")
carrito.append("huevos")
carrito.append("café")
print(carrito)
print(len(carrito))['leche', 'huevos', 'café']
3El 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:
cuadrados = []
for numero in range(1, 6):
cuadrados.append(numero ** 2)
print(cuadrados)[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:
cola = ["Ana", "Luis", "Marta"]
cola.insert(0, "Pedro") # al principio
cola.insert(2, "Sara") # en la tercera posición
print(cola)['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:
invitados = ["Ana", "Luis"]
nuevos = ["Marta", "Pedro"]
invitados.extend(nuevos)
print(invitados)['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:
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))['Ana', 'Luis', ['Marta', 'Pedro']]
3
['Ana', 'Luis', 'Marta', 'Pedro']
4append 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.
| Quieres | Usa | Resultado sobre [1, 2] con [3, 4] |
|---|---|---|
| Añadir un elemento | append | [1, 2, [3, 4]] |
| Añadir varios elementos | extend | [1, 2, 3, 4] |
Quitar por valor: remove#
remove busca el valor y borra la primera aparición:
colores = ["rojo", "verde", "azul", "verde"]
colores.remove("verde")
print(colores)['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.
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)tercero
['primero', 'segundo']
primero
['segundo']Esa doble función lo hace ideal para procesar una lista hasta vaciarla:
pendientes = ["revisar correo", "llamar al banco", "comprar pan"]
while pendientes:
tarea = pendientes.pop(0)
print(f"Haciendo: {tarea} (quedan {len(pendientes)})")
print("Todo hecho.")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:
numeros = [10, 20, 30, 40, 50]
del numeros[0]
print(numeros)
del numeros[1:3] # también borra rebanadas
print(numeros)[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#
temporal = [1, 2, 3, 4]
temporal.clear()
print(temporal)
print(len(temporal))[]
0Unir 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.
turno_manana = ["Ana", "Luis"]
turno_tarde = ["Marta", "Pedro"]
todos = turno_manana + turno_tarde
print(todos)
print(turno_manana) # intacta
print([0] * 5)
print(["-"] * 3 + ["|"])['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étodo | Qué hace | Devuelve |
|---|---|---|
lista[i] = x | Sustituye la posición i | — |
lista.append(x) | Añade x al final | None |
lista.insert(i, x) | Inserta x en la posición i | None |
lista.extend(otra) | Añade los elementos de otra | None |
lista.remove(x) | Borra la primera aparición de x | None |
lista.pop() | Borra y devuelve el último | El elemento |
lista.pop(i) | Borra y devuelve el de la posición i | El elemento |
del lista[i] | Borra la posición i | — |
lista.clear() | Deja la lista vacía | None |
lista + otra | Lista nueva con las dos | La lista nueva |
lista * n | Lista nueva repetida n veces | La lista nueva |
Un ejemplo completo#
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)")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)