Cómo aplanar una lista de listas en Python

Aprenda a aplanar una lista de listas en Python. Compare listas por comprensión anidadas, itertools.chain, suma y métodos recursivos con ejemplos de código.

Pruebe esta solución en el Editor

Descripción general

Cuando trabaje con cálculos matriciales, filas de bases de datos o árboles de datos analizados, con frecuencia encontrará estructuras anidadas, como una lista de listas: `[[1, 2], [3, 4]]`. Aplanar esta estructura significa convertirla en una lista unidimensional que contiene todos los elementos individuales: `[1, 2, 3, 4]`. Python ofrece varias formas elegantes de lograrlo.

La forma más común y pitónica de aplanar una lista de listas es utilizar una comprensión de lista anidada: `[elemento para sublista en matriz para elemento en sublista]`. Si bien la sintaxis puede parecer un poco contraria a la intuición al principio porque los bucles se escriben en el mismo orden que un bucle "for" anidado, está altamente optimizada, es rápida y no requiere importar bibliotecas externas.

Alternativamente, puede utilizar la función `chain.from_iterable()` del módulo `itertools`. Este es el enfoque más eficiente en memoria porque devuelve un iterador que produce elementos de forma perezosa en lugar de asignar una nueva lista en la memoria inmediatamente. Para listas profundamente anidadas (con profundidad arbitraria), debe escribir una función generadora recursiva para descomprimir todos los niveles.

Código y salida de ejecución

Este script demuestra cómo aplanar una lista de listas usando listas por comprensión, itertools.chain y desempaquetado recursivo.

flatten_list.py
Pruébelo en el editor
import itertools

matrix = [[1, 2, 3], [4, 5], [6, 7, 8]]

# Method 1: List comprehension (Pythonic and fast)
flat_comp = [item for sublist in matrix for item in sublist]
print("List comprehension:", flat_comp)

# Method 2: itertools.chain (Highly memory efficient)
flat_chain = list(itertools.chain.from_iterable(matrix))
print("itertools.chain:", flat_chain)

# Method 3: Recursive function for deep/irregular nesting
irregular = [1, [2, 3], [[4, 5], 6]]

def flatten_deep(items):
    result = []
    for item in items:
        if isinstance(item, list):
            result.extend(flatten_deep(item))
        else:
            result.append(item)
    return result

print("Deep flatten:", flatten_deep(irregular))
Salida terminal
List comprehension: [1, 2, 3, 4, 5, 6, 7, 8]
itertools.chain: [1, 2, 3, 4, 5, 6, 7, 8]
Deep flatten: [1, 2, 3, 4, 5, 6]

Implementación paso a paso

  • Utilice una comprensión de lista anidada [elemento para sublista en lista_anidada para elemento en sublista] para estructuras 2D planas.
  • Importe itertools y llame a itertools.chain.from_iterable(nested_list) para una evaluación lenta y amigable con la memoria.
  • Defina una función recursiva que verifique isinstance(item, list) para manejar colecciones anidadas arbitrariamente.

Preguntas frecuentes

¿Puedo usar la función sum() para aplanar listas?

Sí, sum(matrix, []) funcionará, pero no se recomienda. Se ejecuta en complejidad O(N^2) porque crea una nueva copia de la lista en cada adición, lo que provoca un rendimiento terrible para conjuntos de datos grandes.

¿Cuál es el método más rápido para aplanar listas de listas?

itertools.chain.from_iterable() suele ser el más rápido, seguido de cerca por las listas por comprensión anidadas.

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.