← Volver

Cómo unificar listas anidadas (flatten)

Muchos lenguajes de programación incorporan en su librería estándar una función flatten() ("achatar", "aplanar") que recibe como argumento un conjunto de listas anidadas y retorna una única lista sin anidar. Por ejemplo:

>>> flatten([1, [2, 3], [[4], 5], 6, [[[7]]]])
[1, 2, 3, 4, 5, 6, 7]

Como Python carece de ella, una posible implementación es la siguiente:

def flatten(nested_list):
try:
head = nested_list[0]
except IndexError:
return []
return ((flatten(head) if isinstance(head, list) else [head]) +
flatten(nested_list[1:]))

Nótese que este código solo opera con listas; para soportar otras colecciones deben añadirse como segundo argumento para isinstance(). Por ejemplo, isinstance(head, (list, tuple)) hace que la función trabaje también con tuplas.

Una segunda implementación usando un generador reza asi:

def iflatten(nested_list):
try:
head = nested_list[0]
except IndexError:
return
try:
yield from iflatten(head)
except TypeError:
yield head
yield from iflatten(nested_list[1:])

Esto es más eficiente si se acceden a los elementos de la lista resultante de a uno por vez, puesto que no se cargan todos en memoria al mismo tiempo, especialmente útil si la lista original es muy extensa. Además, puede operar sobre cualquier objeto iterable. No obstante, para grandes volúmenes de datos considérese la función ndarray.flatten() de NumPy.

¿Alguna duda sobre este código? ¡Preguntanos en el foro!