flatten лист из разных типов данных python
Подскажите, пожалуйста, как сделать правильный flatten list для сиквенса ниже:
[[y, f, r], [[q, "e"], [24, {"aa": "vaddlue"}], 35], "eee", [45, 15, 36], [57], 26, [[88], [90, 30, [[[5]]]]]]
пробовала сделать так, но мой метод не охватывает все затрагиваемые варианты в подсписках
def flatten_list(preobrjenie):
flat_list = []
for element in preobrjenie:
if type(element) is list:
for item in element:
if type(item) is dict:
for key, value in item.items():
flat_list.append(key)
flat_list.append(value)
else:
flat_list.append(item)
elif type(element) is dict:
for key, value in element.items():
flat_list.append(key)
flat_list.append(value)
else:
flat_list.append(element)
return flat_list
Ответы (1 шт):
Автор решения: Михаил Муругов
→ Ссылка
Интересная задачка.
from collections import abc # Абстрактные типы контейнеров
def flatten(obj):
if isinstance(obj, abc.Iterable) and not isinstance(obj, str): # Если объект является итерируемым и не строка
if isinstance(obj, abc.Mapping): # Если объект является маппингом (словарь)
yield from flatten(obj.items()) # Рекурсивно вызываем для пар (ключ, значение) словаря
else: # Если объект итерируемый, но не словарь
for item in obj: # Перебираем его элементы
yield from flatten(item) # Рекурсивно вызываем функцию для каждого из них
else: # Если объект не итерируемый или строка
yield obj # Возвращаем его самого
inp = [['y', 'f', 'r'], [['q', "e"], [24, {"aa": "vaddlue"}], 35], "eee", [45, 15, 36], [57], 26, [[88], [90, 30, [[[5]]]]]]
print(list(flatten(inp)))
Вывод:
['y', 'f', 'r', 'q', 'e', 24, 'aa', 'vaddlue', 35, 'eee', 45, 15, 36, 57, 26, 88, 90, 30, 5]