Las listas de Python son la estructura de datos más usada del lenguaje. Casi todos los programas que escribas van a necesitar añadir elementos, eliminarlos o reorganizarlos. Python incluye cinco métodos que cubren el 90 % de esos casos: append(), extend(), insert(), remove() y pop(). Conocerlos bien, y saber cuándo usar cada uno, evita bugs silenciosos que aparecen en producción.
append() añadir un elemento al final
append(x) añade el objeto x como un único elemento al final de la lista. La clave es como un único elemento: si pasas una lista, se añade como lista anidada, no se fusiona.
frutas = ["manzana", "pera"]
frutas.append("naranja")
print(frutas) # ['manzana', 'pera', 'naranja']
# Trampa clásica: append de una lista anida en lugar de fusionar
frutas.append(["uva", "kiwi"])
print(frutas) # ['manzana', 'pera', 'naranja', ['uva', 'kiwi']]
extend() fusionar otra secuencia
extend(iterable) añade cada elemento del iterable por separado. Funciona con listas, tuplas, generadores o cualquier cosa iterable.
letras = ["a", "b"]
letras.extend(["c", "d"])
print(letras) # ['a', 'b', 'c', 'd']
# También funciona con cadenas (itera carácter a carácter)
letras.extend("ef")
print(letras) # ['a', 'b', 'c', 'd', 'e', 'f']
# El operador += es equivalente a extend
numeros = [1, 2]
numeros += [3, 4]
print(numeros) # [1, 2, 3, 4]
La diferencia clave: append vs extend
Esta es la confusión más frecuente entre principiantes:
a = [1, 2, 3] b = [1, 2, 3] a.append([4, 5]) # añade UNA lista anidada b.extend([4, 5]) # añade DOS elementos sueltos print(a) # [1, 2, 3, [4, 5]] print(b) # [1, 2, 3, 4, 5] print(len(a)) # 4 print(len(b)) # 5
insert() insertar en una posición
insert(i, x) inserta el elemento x antes de la posición i. Con índice 0 inserta al principio; con un índice mayor que la longitud, añade al final sin lanzar error.
colores = ["rojo", "azul", "verde"] colores.insert(1, "amarillo") print(colores) # ['rojo', 'amarillo', 'azul', 'verde'] # Insertar al principio colores.insert(0, "blanco") print(colores) # ['blanco', 'rojo', 'amarillo', 'azul', 'verde']
Ten en cuenta que insert() desplaza todos los elementos posteriores una posición: es una operación O(n) en el peor caso. Para inserciones frecuentes en el inicio, considera collections.deque.
remove() y pop() eliminar elementos
remove(x) busca la primera aparición de x y la elimina. Lanza ValueError si el elemento no existe. pop(i) elimina y devuelve el elemento en la posición i; sin argumento, elimina el último.
nums = [10, 20, 30, 20, 40] nums.remove(20) # elimina la primera aparición del valor 20 print(nums) # [10, 30, 20, 40] ultimo = nums.pop() # elimina y devuelve el último print(ultimo) # 40 print(nums) # [10, 30, 20] segundo = nums.pop(1) # elimina y devuelve el elemento en índice 1 print(segundo) # 30 print(nums) # [10, 20]
El error clásico: modificar una lista mientras la iteras
Nunca modifiques una lista mientras la recorres con un bucle for. El iterador interno avanza por índice y se salta elementos:
# MAL: se saltan elementos
numeros = [1, 2, 3, 4, 5, 6]
for n in numeros:
if n % 2 == 0:
numeros.remove(n)
print(numeros) # [1, 3, 5] correcto por suerte, pero...
numeros = [1, 2, 2, 3]
for n in numeros:
if n == 2:
numeros.remove(n)
print(numeros) # [1, 2, 3] ¡falla! Se salta un 2
# BIEN: itera sobre una copia o usa list comprehension
numeros = [1, 2, 2, 3]
numeros = [n for n in numeros if n != 2]
print(numeros) # [1, 3]
Estos cinco métodos cubren la mayoría de las necesidades de manipulación de listas. La regla práctica: usa append() para un elemento, extend() para fusionar colecciones, insert() cuando necesites posición exacta, remove() cuando sabes el valor y pop() cuando necesitas el elemento eliminado.
