Объединить вложенные списки и числа в один список Python
Решил пройти задание на CheckiO, где требуется объединить вложенные списки и числа в один список, например:
([-1, [1, [-2], 1], -1]) == [-1, 1, -2, 1, -1]
([1, [2, 2, 2], 4]) == [1, 2, 2, 2, 4]
Кто подскажет, в чём ошибка и как её исправить?
from itertools import chain
def flat_list(array):
lst_one = []
lst_two = []
for i in array:
if isinstance(i, list):
lst_one.append(i)
if isinstance(i, int):
lst_two.append(i)
combined = chain(lst_one, lst_two)
return list(combined)
Ответы (2 шт):
Автор решения: Дмитрий Игоревич
→ Ссылка
Наверное самым логичным решением здесь будет рекурсивная функция.
array_to_parse_1 = ([-1, [1, [-2], 1], -1])
array_to_parse_2 = ([1, [2, 2, 2], 4])
def parse_list(input_array):
result_array = []
for array_item in input_array:
if isinstance(array_item, list) or isinstance(array_item, tuple):
result_array.extend(parse_list(array_item))
else:
result_array.append(array_item)
return result_array
print(parse_list(array_to_parse_1))
print(parse_list(array_to_parse_2))
Автор решения: SergFSM
→ Ссылка
Ошибка в том, что по этому условию if isinstance(i, list) вы добавляете в список вложенные списки, а chain сцепляет эти списки с числами. Исправить, как уже сказали, можно использовав рекурсию. Есть еще вариант с генератором, например такой генератор справляется со всеми типами (кроме строк):
def flat_list(array):
for i in array:
if hasattr(i, '__iter__'):
yield from flat_list(i)
else:
yield i
l = [-1, [1, [-2], 1], -1, (3, -3), {4:5, 6:7}, [range(8,10), [11, 12, {(13,14):15}]]]
print([*flat_list(l)])
#------^-распаковка
'''
[-1, 1, -2, 1, -1, 3, -3, 4, 6, 8, 9, 11, 12, 13, 14]