Python: aplanar listas anidadas con índices
Dada una lista de listas anidadas arbitrariamente profundas de tamaño arbitrario, me gustaría un iterador plano y profundo primero sobre todos los elementos en el árbol, pero también con indicaciones de ruta tales que:
for x, y in flatten(L), x == L[y[0]][y[1]]...[y[-1]].
Es decir
L = [[[1, 2, 3], [4, 5]], [6], [7,[8,9]], 10]
flatten(L)
debería producir:
(1, (0, 0, 0)),
(2, (0, 0, 1)),
(3, (0, 0, 2)),
(4, (0, 1, 0)),
(5, (0, 1, 1)),
(6, (1, 0)),
(7, (2, 0)),
(8, (2, 1, 0)),
(9, (2, 1, 1)),
(10, (3,))
Hice una implementación recursiva para esto usando generadores conyield
declaraciones:
def flatten(l):
for i, e in enumerate(l):
try:
for x, y in flatten(e):
yield x, (i,) + y
except:
yield e, (i,)
pero no creo que sea una implementación buena o responsable, ¿hay alguna receta para hacer esto de manera más general usando solo builtins o std lib cosas comoitertools
?