跳出 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 使用与实际变量匹配的字符串让我感到困惑,但我已尽最大努力将其构造为类似于您的问题。但要点是使用递归生成器优雅地遍历嵌套结构,希望有所帮助。
这是我的代码:
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 使用与实际变量匹配的字符串让我感到困惑,但我已尽最大努力将其构造为类似于您的问题。但要点是使用递归生成器优雅地遍历嵌套结构,希望有所帮助。