Вы можете рассматривать категории / подкатегории как дерево с N ветвями в каждом узле (в зависимости от того, сколько у вас категорий).Из того, что я могу собрать, вы в основном хотите создать упорядоченный список листьев дерева.
Один простой способ сделать это - с помощью генераторов (используя терминологию из исходного вопроса):
def lookup(elem):
# do your SQL call here for a given category 'elem' and return
# a list of it's subcategories
return []
def leaves(lst):
if lst:
for elem in lst: # for every category
for sublist in leaves(lookup(elem)): # enumerate it's sub categories
yield sublist # and return it
yield elem # once lookup(elem) is [] return elem
d = { 111: [Run, Jump, swim] , 222: [Eat, drink] }
for key, lst in d.items():
print key, [elem for elem in leaves(lst)]
Если вы не знакомы с генераторами, они просто конструкции итераторов, которые «дают»значения вместо того, чтобы возвращать их.Разница в том, что выдача только приостанавливает итератор в том месте, которое будет продолжаться там, где он остановился, когда запрашивается следующее значение.
С некоторой умной рекурсией внутри генератора вы можете просто проанализировать все дерево.
[elem for elem in leaves(lst)]
- это понимание списка, и оно просто создает список, содержащий elem
для каждого элемента, повторяемого по leaves
.