Найти в Дзене

Программирование на Python. Рекурсивный алгоритм просмотра элементов коллекций с вложенными объектами

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

А это подборки моих материалов на канале

Рекурсивный перебор коллекций в Python

До сих мы рассматривали так называемую прямую рекурсию. При прямой рекурсии функция вызывает самую себя. А сегодня интересный пример, так называемой косвенной рекурсии. Суть её можно упрощённо представить так: функция вызывает другую функцию, которая может потом вызвать первую функцию. Иногда таких "других" функций может быть несколько.

Задача, которую мы сейчас рассмотрим, известная. Дело в том, что элементами коллекций (списков, кортежей, множеств, словарей) могут быть другие коллекции, элементами которых также могут быть сложные элементы. Задача стоит так: нужно вывести простые элементы данной структуры. Рекурсия явно напрашивается для реализации данной задачи.

Ниже представлена программа, которая имеет на входе сложную иерархическую структуру из коллекций. Нужно развернуть структуру в линейную последовательность, обозначая вложенность.

Текст программы см. ниже
Текст программы см. ниже
primer90.py

На входе программы подается коллекция, на выходе развёрнутая структура с выводом простых элементов. Для того, чтобы можно было подавать на вход структуру коллекция в том виде, в каком она используется в программе, мы используем функцию eval(), которая преобразует строку в нужную программную структуру.

Обратим внимание, что функция gettype() вызывает функции coll() или dic(), которые в свою очередь вызывают gettype(). Т.е. на лицо косвенная рекурсия.

Например, на входе

{(1, 2, 3), (3, 4, 5), (4, 6, (1000, 1001))}

На выходе

Множество 0
Кортеж 1
3
4
5
Конец кортежа 1
Кортеж 1
4
6
Кортеж 2
1000
1001
Конец кортежа 2
Конец кортежа 1
Кортеж 1
1
2
3
Конец кортежа 1
Конец множества 0

Числами показывается уровень вложенности.

Ещё один пример

[[[1, [10001, 10002, 'qwerty', (90, 91)]]], [[2]], [[3]], [[4]]]

На выходе

Список 0
Список 1
Список 2
1
Список 3
10001
10002
qwerty
Кортеж 4
90
91
Конец кортежа 4
Конец списка 3
Конец списка 2
Конец списка 1
Список 1
Список 2
2
Конец списка 2
Конец списка 1
Список 1
Список 2
3
Конец списка 2
Конец списка 1
Список 1
Список 2
4
Конец списка 2
Конец списка 1
Конец списка 0

Ну пока, всё!

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Я вижу во сне, что вы видите во сне, что я вижу вас во сне
Я вижу во сне, что вы видите во сне, что я вижу вас во сне