MiddleКодИногдаЕщё не отвечали
Разверните произвольно вложенный список
Выдайте каждое листовое значение из списка, вложенного на любую глубину, слева направо.
Требования:
- Обработать произвольную глубину вложенности (списки в списках в списках...).
- Не-списочные элементы — это листья, выдаются как есть.
def flatten(nested):
# ваш код здесь
print(list(flatten([1, [2, [3, 4], 5], 6]))) # [1, 2, 3, 4, 5, 6]
Допишите реализацию.
Рекурсия через генератор: для каждого элемента, если это list, yield from flatten(item); иначе yield item. yield from делегирует под-генератору, лениво разворачивая любую глубину. Материализуйте результат через list(flatten(...)), когда нужен конкретный список.
- ✗Использовать плоское включение, разворачивающее лишь один уровень
- ✗Считать, что
sum(nested, [])рекурсирует в более глубокую вложенность - ✗Полагать, что у списков есть встроенный метод
flatten
- →Что делает
yield from, чего достиг бы и обычный циклfor ... yield? - →Как расширить это, чтобы разворачивать кортежи и другие итерируемые, а не только списки?
Оглавление
Задача
Реализуйте flatten: лениво выдайте все листовые значения из списка, вложенного на любую глубину.
Решение
def flatten(nested):
for item in nested:
if isinstance(item, list):
yield from flatten(item) # рекурсивный генератор
else:
yield item
print(list(flatten([1, [2, [3, 4], 5], 6]))) # [1, 2, 3, 4, 5, 6]
Ключевые моменты
yield fromделегирует под-генератору, передавая его значения наружу — разворачивает любую глубину.- Генератор ленив: значения текут по мере запроса, без построения промежуточных списков.
- Проверка
isinstance(item, list)отделяет ветви от листьев.
Оглавление