突破for循环并使用更新列表重新执行

时间:2015-06-27 15:10:16

标签: python for-loop appendchild

这是我的代码:

<div class="party">
        <div class="dance">
          <h2 id="head">Your Party begins here</h2>
          <p id="intro1">Start dancing</p>
          <a id="starter" href="#" >Dance now</a> </div>
        <a id="main" href="#"><img class="img-responsive" src="images/default.jpg" alt="main image"></a> 

首先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?") 将是一个布尔值,因此我的if语句实际上是&#34;如果是真和(groupPerm不在所有组中):&#34;。通常情况下,权限将不存在,除非它是真的,但有时它们 设置为False。

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

我的解决方案是,当我到达self.permissions["groups"][parseparent]["permissions"]时,我需要跳回并重新执行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),但是...这将是服务器我现在的目的。

简而言之......从父母列表开始,查看其中一个项目是否是另一个列表(孩子),然后查看该孩子是否有孩子;直到找不到更多的子孙。

2 个答案:

答案 0 :(得分:1)

使用像这样的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?")

答案 1 :(得分:1)

看起来您的问题最好通过递归生成器来解决。对不起,我百分之百不了解你的结构,但请考虑以下几点:

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

我已经尽力将它构造成类似于你的问题,但是例如使用与实际变量相匹配的字符串会使我感到困惑。但重点是使用递归生成器优雅地遍历嵌套结构,希望有所帮助。