Учитывая список произвольно значимых вложенных списков произвольного размера, я хотел бы использовать итератор с глубиной вперёд по всем элементам дерева, но с указателями пути, а также:
for x, y in flatten(L), x == L[y[0]][y[1]]...[y[-1]].
Это
L = [[[1, 2, 3], [4, 5]], [6], [7,[8,9]], 10]
flatten(L)
должен давать:
(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,))
Я сделал рекурсивную реализацию для этого, используя генераторы с операторами yield
:
def flatten(l):
for i, e in enumerate(l):
try:
for x, y in flatten(e):
yield x, (i,) + y
except:
yield e, (i,)
но я не думаю, что это хорошая или ответственная реализация. Есть ли какой-нибудь рецепт для этого в целом, просто используя встроенные или std файлы lib, такие как itertools
?