我有一个字典,其中包含id和每个ID的多个值,这些字符串都是字符串。对于每个Id的每个值,我进行数据库查询并得到设置结果:
{111: Run, Jump, swim}
{222: Eat, drink}
所以对于每个值,让我们说运行我执行一个查询,它返回另一组数据,然后选择该组的每个值并运行查询,这将给出另一个集合,最后我来到一个只有一个项目得到的点返回。一旦我完成Run
的每个子元素的最终元素,然后我移动到Jump
并继续。
之前我问过这个问题,但没有得到任何结果,所以人们告诉我删除代码,然后再问这个问题。以下是几天前我问过的同一个问题的link。我是否需要实现像disjoin set这样的东西?
答案 0 :(得分:2)
您可以将类别/子类别视为一个树,每个节点有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
的列表。
答案 1 :(得分:0)