Как преобразовать многомерный список в одномерный?
Имеем многомерный список:
[0,
[0,38.0, -38.0],
[0,4.0,-4.04],
[0],
[0, -30.5],
[0],
[0],
[0,21.7,2.7,-14.7]]
Как преобразовать его в обычный (одномерный) список a = []?
Ожидаемый результат:
[0,0,38.0,-38.0,0,4.0,-4.04,0,0,-30.5,0,0,0,21.7,2.7,-14.7]
Ответы (2 шт):
Автор решения: Danis
→ Ссылка
def f(arr0):
arr1 = [] #создадим пустой массив
for i in arr0: #пройдёмся по всем элементам входного массива
if type(i) != list:
arr1.append(i) #если тип не list то в arr1 добавляем i
else:
arr1 += f(i) #иначе запускаем функцию для i
return arr1
вывод:
[0, 0, 38.0, -38.0, 0, 4.0, -4.04, 0, 0, -30.5, 0, 0, 0, 21.7, 2.7, -14.7]
Автор решения: MaxU
→ Ссылка
Можно воспользоваться методом list.extend() если максимальная глубина вложенности - 1:
res = []
for x in lst:
res.extend(x if isinstance(x, list) else [x])
результат:
In [46]: res
Out[46]: [0, 0, 38.0, -38.0, 0, 4.0, -4.04, 0, 0, -30.5, 0, 0, 0, 21.7, 2.7, -14.7]
Универсальное решение для списков с любой глубиной вложенности:
from collections.abc import Iterable
def flatten(l):
for el in l:
if isinstance(el, Iterable) and not isinstance(el, (str, bytes)):
yield from flatten(el)
else:
yield el
Пример:
In [54]: res = list(flatten([1, [2, 3], [4, [5, [6, 7], 8, [9, [10, [11]]]]]]))
In [55]: res
Out[55]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]