【问题标题】:How to get a for loop to re-evaluate on each iteration of a while loop如何让 for 循环重新评估 while 循环的每次迭代
【发布时间】:2012-07-05 21:20:03
【问题描述】:

问题部分代码:

while counter < length:
    if something:
    else:
        for key,value in dictionary.items():
            if something:
            else:
    counter += 1

结构是{ key:[ {key:value,key1:value1}, {key:value,key1:value1} ] } 这就是计数器(列表索引)的用途。

所以我在自学 Python (3.2.3) 时编写的一些脚本中多次注意到这一点。

我尝试搜索但没有运气(也许我的搜索词是错误的,谁知道呢?)并且我检查了文档,问题似乎是对于 while 语句它说,“while 语句用于只要表达式为真,就重复执行”。对于 For 语句,它说,“表达式列表只计算一次”。

现在,当我的脚本运行时,它不断收到一个关键错误,因为计数器增加了 1;但是 for 语句没有更新以反映另一个字典列表中的新元素;它仍在使用第一个元素。

我假设 while 循环中的每次迭代都会导致 For 语句重新计算。显然我在这方面是错误的。

现在我可以重写代码来解决这个问题,但是我已经遇到过几次了,我想知道的是如何以这种方式在 while 语句中使用 For 循环,但是让它通过 while 循环在每次迭代中重新评估 For 语句。

谢谢!

更新:我在下面添加了实际代码。如果我只是做错了什么,我不会感到惊讶。我正在查看调试器中的值,当计数从 0 变为 1 时,它从 while 循环的下一次迭代开始。从那里一切都按原样进行,直到它到达 For 循环“for key,value in item.items():”,并且 item.items() 的值根本没有改变。 更新更新:在试图弄清楚之后,我很确定这是 v 中的 for 项目:这导致了问题。让我们看看我能不能解决它!

已修复!问题在于 v: 中的 For 项,它位于 while 循环之外,通过将其移入循环来解决。

def checkDifferences(newFile,oldFile):
    resultDiff = []
    for k,v in newFile.items():
        if newFile[k] != oldFile[k]:
            for item in v:
                count = 0
                lengthList = len(newFile[k])
                newKeys = newFile[k][count].keys()
                oldKeys = oldFile[k][count].keys()                
                while count < lengthList:
                    if newKeys == oldKeys:
                        for key,value in item.items():
                            newValue = newFile[k][count][key] 
                            oldValue = oldFile[k][count][key]
                            if newValue == oldValue:
                                pass
                            else:
                                resultDiff.append((k,count,key, oldValue,newValue))
                    else:
                        newValue = list(newFile[k][count].keys())
                        oldValue = list(oldFile[k][count].keys())
                        keyList = [key for key in newValue if key not in oldValue]
                        print(keyList)
                        for key,value in item.items():
                            if key in keyList:
                                oldValue = oldFile[k][count][oldKey]
                                resultDiff.append((k,count,key, None,newValue))
                            else:
                                oldValue = oldFile[k][count][key]
                            newValue = newFile[k][count][key]
                            if newValue == oldValue:
                                pass
                            else:
                                resultDiff.append((k,count,key, oldValue,newValue))
                            oldKey = key
                    count += 1
     return resultDiff

【问题讨论】:

  • 我很确定每次 While 循环循环时都会重新评估 For 表达式。你如何使用计数器?如果您可以包含足够的代码来复制行为,那将是最简单的。
  • 我也认为问题出在 dictionary.items()
  • 你并没有真正说明问题出在哪里。您是否每次都期望 dictionary.items() 有不同的值?如果是这样,您实际上需要在某处使用counter
  • 我第二个@HugoRune - 请尝试为您遇到的问题创建一个可运行的示例。从您发布的内容来看,不清楚您要做什么,也不清楚什么是失败的。

标签: python for-loop while-loop evaluation flow


【解决方案1】:

for 语句中的表达式在每次 for 循环开始时计算一次。由于您已将 for 循环放入 while 循环中,因此每次在 while 循环周围遇到 for 语句时,都会计算表达式。

您的代码还有其他问题。发布一个真实的代码示例。

【讨论】:

    【解决方案2】:

    我的猜测是相信 OP 可能想要遍历主字典中包含的 'dict,以下是一般流程。

    list_of_dicts = dictionary['key']
    for subdict in list_of_dicts:
        print subdict.items() # or whatever
    

    【讨论】:

      【解决方案3】:

      您的问题对我来说似乎有点含糊,但是根据您的 cmets 关于结构格式和示例代码的内容,您可以通过以下几行来处理其内容:

      # for structure { key:[ {key:value,key1:value1}, {key:value,key1:value1}, ... ] }
      
      for dict_list in structure.values():
          if something:
          else:
              for key,value in dict_list.items():
                  if something:
                  else:
      

      每次从外部structure 字典中检索另一个字典列表时,都会评估内部for 循环。我使用了structure.values(),因为您似乎对structure 的密钥不感兴趣。 structure 的每个键似乎都与作为字典列表的 value 相关联,即上面代码中使用的 dict_list 变量。

      在 Python 中,通常不需要计数器或循环索引来处理列表或字典等容器的内容,因为您可以直接使用 for 对其进行迭代,如图所示。

      【讨论】: