Создал 4096 ветвей дерева из циклов for → for → for ... и т.д.. Как их теперь найти?
Вычесть 1 из значений, чтобы вместо 1 и 2 стали 0 и 1, и, поздравляю, вы изобрели двоичную систему исчисления и записали ей подряд числа от 0 до 2^12 – 1
Найдите сами, что такое и с чем едят b-tree,
а также что такое узлы и ребра (это то из чего состоят графы и деревья),
как создать граф (дерево) и совершать обходы по нему.
Поверьте, это гораздо интересней, чем мучать процессор 12-ю вложенными циклами.

Ну а по теме наверное так:
import networkx as nx

G = nx.balanced_tree(2,12)
print (G.edges()) # выведет все дуги дерева
print (G.nodes()) # выведет все узлы дерева

А дальше какой хотите обход делайте по дереву.

Или так:
Вместо print(allwood) сохраняйте путь в список:
all_paths.append(allwood).
Не забудьте до циклов проинициализировать all_paths = [].
Получите матрицу(таблицу), в каждой строке которой один из путей,
столбец указывает на уровень графа (дерева) - готовая адресация.

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