跳出 for 循环并使用更新的列表重新执行

break out of a for loop and re-do it with updated list

这是我的代码:

for parseparent in allgroups:
  for groupPerm in self.permissions["groups"][parseparent]["permissions"]:
    if self.permissions["groups"][parseparent]["permissions"][groupPerm] and (groupPerm not in allgroups):
      allgroups.append(group)
      print("found a child- shall we do again?")

首先 self.permissions["groups"][parseparent]["permissions"] 将是一个布尔值,因此我的 if 语句实际上读起来像 "If True and (groupPerm not in allgroups):"。通常权限不会存在,除非它是 true,但有时它们 设置为 False。

我的问题是,如果我们到达 print 语句,我需要重新 运行 这个循环,因为所有组现在都会有列表的新成员。没有预定义的嵌套限制,所以我不能像范围一样只进行一定数量的迭代。

我的解决办法是,当我到达print("found a child- shall we do again?")时,我需要跳回并重新做for parseparent in allgroups:。我考虑过列表理解,但在这种情况下我不知道该怎么做。大多数示例似乎都是针对已知的、设定的迭代次数。

基本上,我想我正在从多个词典中构建列表。这是一个例子,但只有两层深(可能更多):

allgroups starts out as []
master list = [dict1]
dict1 = {"dict2": True, "item1": True, "item2": False}
dict2 = {"dict3": True, "item4": True, "item5": False}
dict3 = {"Other": True, "item6": True, "item7": False}
dict4 = {"item9": False, "item8": True, "itemz": True}

一旦完成,allgroups 应该包含 [dict1, dict2, item1, dict3, item4, Other, item6] - 理想情况下,我真的希望它只包含 dictx 项([dict1, dict2, dict3]),但是...现在将服务于我的目的。

简而言之...从父列表开始,查看其中一项是否是另一个列表(子项),然后查看该子项是否有子项;直到找不到子子为止。

像这样使用 while 循环:

itemsToProcess = allgroups[:]
while len(itemsToProcess) > 0:        
    parseparent = itemsToProcess.pop(0)
    for groupPerm in self.permissions["groups"][parseparent]["permissions"]:
        if self.permissions["groups"][parseparent]["permissions"][groupPerm] and (groupPerm not in allgroups):
            allgroups.append(groupPerm)
            itemsToProcess.append(groupPerm)
            print("found a child- shall we do again?")

看来你的问题最好用递归生成器来解决。抱歉,我不能百分百理解您的结构,但请考虑以下几点:

def recurse_yield(d):
    yield d
    for k, v in d.iteritems():
        if v:
            recurse_yield(k)

d1 = {"hey": False}
d2 = {d1: True}

for k in recurse_yield(d2):
    print k

虽然 e.g.the 使用与实际变量匹配的字符串让我感到困惑,但我已尽最大努力将其构造为类似于您的问题。但要点是使用递归生成器优雅地遍历嵌套结构,希望有所帮助。