Агрегация данных — наиболее важная операция при работе с деревьями. Подсчитать общее число файлов в директории, общий размер всех файлов, получить список всех файлов, найти все файлы по шаблону, все это — примеры агрегирования данных.
Ключевым моментом в агрегирующих операциях является накопление результата. Для данной задачи хорошо подходит обход дерева в глубину с использованием рекурсивного процесса, который подробно рассматривается в предыдущем уроке. С его помощью мы обходим все узлы дерева и собираем результат, начиная с самого нижнего уровня.
Рассмотрим агрегацию с использованием рекурсивного процесса на примере подсчета общего количества узлов в дереве. То есть мы хотим узнать, сколько всего файлов и директорий содержится в нашем файловом дереве.
from hexlet import fs
tree = fs.mkdir('/', [
fs.mkdir('etc', [
fs.mkfile('bashrc'),
fs.mkfile('consul.cfg'),
]),
fs.mkfile('hexletrc'),
fs.mkdir('bin', [
fs.mkfile('ls'),
fs.mkfile('cat'),
]),
])
# В реализации используем рекурсивный процесс,
# чтобы добраться до самого дна дерева.
def get_nodes_count(node):
if fs.is_file(node):
# Возвращаем 1 для учета текущего файла
return 1
# Если узел — директория, получаем его детей
children = fs.get_children(node)
# Самая сложная часть
# Считаем количество потомков для каждого из детей,
# вызывая рекурсивно нашу функцию get_nodes_count
descendant_counts = list(map(get_nodes_count, children))
# Возвращаем 1 (текущая директория) + общее количество потомков
return 1 + sum(descendant_counts)
get_nodes_count(tree)
# 8
https://repl.it/@hexlet/python-trees-aggregation-get-nodes-count
Кода здесь немного, но он довольно хитрый. Есть несколько ключевых моментов:
Перед тем как двигаться дальше, с этим кодом нужно "поиграть". Это единственный способ разобраться с ним.
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт