Cómo aplanar una lista en Python

Aliaksei Yursha 25 junio 2020
  1. Lista de Python aplanamiento superficial
  2. Aplanamiento profundo de la lista de Python
Cómo aplanar una lista en Python

El aplanamiento es una operación en la que tomamos una lista de listas anidadas y la convertimos en una estructura de datos diferente que no contiene listas anidadas.
En su lugar, incluye todos los elementos de todas las listas, que inicialmente estaban anidadas.
Una estructura de datos de este tipo se denomina lista plana o lista plana.

La lista original puede contener listas anidadas sólo en el primer nivel de anidación, para
ejemplo [[1, 2], [3, 4]].
Por lo demás, contiene listas de los niveles segundo, tercero y posteriores de anidación,
por ejemplo [[[1], [2]], [3, 4]].
Se dice que tal lista contiene listas anidadas profundamente.

Si queremos desanidar un solo nivel de anidación, lo llamamos aplanamiento poco profundo.
Si queremos anidar todos los niveles de anidación, lo llamamos aplanamiento profundo.

Lista de Python aplanamiento superficial

Un enfoque simple para entender y visualizar es usar un doble bucle for.

El primer bucle for atraviesa listas anidadas. El segundo bucle for itera sobre los elementos de cada lista anidada y los añade a una lista plana resultante uno a uno.

>>> flat_list = []
>>> original_list = [[1, 2], [3, 4]]
>>> for l in original_list:
...   for item in l:
...     flat_list.append(item)
...
>>> flat_list
[1, 2, 3, 4]

El método anterior es claro y legible, pero la expresividad de Python permite
para lograr el mismo objetivo en una sola línea.
Aquí la lista de comprensiones de Python viene a ayudar.

>>> original_list = [[1, 2], [3, 4]]
>>> flat_list = [item for l in original_list for item in l]
>>> flat_list
[1, 2, 3, 4]

Si no necesitas una lista plana en sí misma, pero quieres ser capaz de iterar sobre todos los elementos
de todas las sublistas como si vinieran de una única estructura de datos planos, puede utilizar itertools.chain().

>>> import itertools
>>> original_list = [[1, 2], [3, 4]] 
>>> iterator = itertools.chain(*original_list)
>>> for item in iterator:
...   print(item)
...
1
2
3
4

Si utiliza Pandas - un paquete de código abierto para el análisis de datos en Python - también hay una forma incorporada.

>>> from pandas.core.common import flatten
>>> original_list = [[1, 2], [3, 4]]  
>>> flat_list = list(flatten(original_list))
>>> flat_list
[1, 2, 3, 4]

Aplanamiento profundo de la lista de Python

Como se mencionó anteriormente, el aplanamiento superficial no funcionará, si tenemos listas profundamente anidadas.
Desanidará sólo el primer nivel de anidación, como se muestra en el ejemplo de abajo.

>>> deeply_nested_list = [[[1, 2], 3], [4, 5, 6]]
>>> flat_list = [item for l in deeply_nested_list for item in l]
>>> flat_list
[[1, 2], 3, 4, 5, 6]

Para hacer el aplanamiento profundo, use iteration_utilities.deepflatten() del paquete PyPI iteration-utilities.

Primero, instale el paquete PyPI propiamente dicho.

$ pip install iteration-utilities

Luego aplane sus listas anidadas profundamente.

>>> from iteration_utilities import deepflatten
>>> deeply_nested_list = [[[1, 2], 3], [4, 5, 6]]
>>> flat_list = list(deepflatten(deeply_nested_list))
>>> flat_list
[1, 2, 3, 4, 5, 6]

Artículo relacionado - Python List