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.
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.
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))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
Aprenda a utilizar listas por comprensión en Python. Escriba bucles concisos, aplique filtros condicionales y cree matrices con una sintaxis visual limpia.
Cómo dividir una lista en PythonAprenda a dividir listas en Python utilizando la potente sintaxis de corchetes. Domine los argumentos de inicio, parada y paso, la indexación negativa y las listas inversas.
Recursos recomendados de Python
Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.
Variables de Python y tipos de datos explicados
Comprender las variables de Python y los tipos de datos principales (cadenas, enteros, flotantes, booleanos). Una guía completa para principiantes sobre la asignación de memoria en Python.
Hoja de referencia de métodos de lista de Python
Guía de referencia rápida para operaciones de listas de Python. Domine la adición, inserción, eliminación, clasificación y corte de elementos.
Python vs JavaScript: ¿Qué lenguaje de programación es mejor?
Una comparación completa entre Python y JavaScript. Explore las diferencias de sintaxis, el rendimiento, los casos de uso (backend frente a frontend) y ejemplos de codificación.