カテゴリ/サブカテゴリは、各ノードに N 個の分岐があるツリーとして見ることができます (カテゴリの数によって異なります)。私が収集できることから、基本的には木の葉の順序付きリストを生成したいと考えています。
それを行う簡単な方法の1つは、ジェネレーターを使用することです(元の質問の用語を使用):
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)]
ジェネレーターに慣れていない場合、ジェネレーターは、値を返すのではなく値を "生成" する単純なイテレーター構造です。違いは、yield はその場所でのみイテレータを一時停止し、次の値が要求されたときに停止した場所から続行することです。
ジェネレーター内で巧妙な再帰を使用すると、ツリー全体を簡単に解析できます。
はリスト内包表記であり、によって反復されるすべての要素[elem for elem in leaves(lst)]
を含むリストを単純に構築します。elem
leaves