您可以将类别/子类别视为在每个节点具有 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)]
如果您不熟悉生成器,它们只是迭代器构造,“产生”值而不是返回它们。不同之处在于,yielding 只会在该位置暂停迭代器,当请求下一个值时,它将在停止的地方继续。
通过生成器内部的一些巧妙的递归,您可以简单地解析整个树。
这[elem for elem in leaves(lst)]
是一个列表推导,它只是构建一个列表,其中包含elem
由 迭代的每个元素leaves
。