Вот порт zip-библиотеки clojure для python.
https://github.com/trivio/zipper
Это неизменная структура данных, которая всегда возвращает новый результат для каждой операции.
Идеально подходит для функционального программирования или когда вы хотите сохранить историю изменений, внесенных в дерево.
Вы можете манипулировать любым деревом, которое можно описать с помощью 3 функций:
branch (node): возвращает true, если у узла могут быть дочерние элементы
children (node): возвращает кортеж потомков узла
make_node (node, children): Создает новый узел для замены текущего узла после того, как его дочерние элементы были изменены.