【问题标题】:While-loop within a while-loop pythonwhile循环python中的while循环
【发布时间】:2014-11-02 15:38:07
【问题描述】:

我正在尝试在 while 循环中编写一个 while 循环,但由于某种原因它没有按应有的方式工作。我知道我可能在这里遗漏了一些非常微不足道的东西,但我就是不明白它是如何不起作用的!

循环的目的是比较两个字符串,看它们是否包含任何相同的三个连续单词。我首先将这两个字符串拆分为它们各自的 3 个单词字符串组合的列表,这些组合存储在列表 strings 和 stringscompare 中。然后我循环遍历字符串中的每个 3 个单词字符串比较字符串中的每个 3 个单词字符串。

对于某些人来说,这可能看起来很长,但我只是一个新手程序员,任何改进都将不胜感激。

所以目前,第二个while循环一直运行,但是第一个只循环一次,对于strings中的第一个字符串。如果字符串匹配,我希望它从两个循环中中断,但是这些循环也在一个更大的 for 循环中,我不希望它中断。

例如

'这是一个字符串'
'这是另一个字符串' -- 不匹配
'这是一个字符串列表' -- 匹配 'this is a'
'列表是一个字符串' -- 应该匹配 'is a string' 但目前不匹配

strings = <list of 3 word strings> [...,...,...]
stringscompare = <list of 3 word strings to compare>
v=0, x=0
while v < len(strings) and stop == False:
    while x < len(stringscompare) and stop == False:
        if re.search(strings[v], stringscompare[x]):
            same.append(dict)
            stop = True
        x += 1
    v +=1

【问题讨论】:

  • 如果没有字符串的具体示例,stringscompare 很难判断这里出了什么问题,但我的猜测是在内循环中,stop 设置为 True,因此外循环终止。您确定外部循环中的条件和 stop == False 是有意的吗?

标签: python string loops while-loop


【解决方案1】:

你永远不会在外循环内重置x。因此,在外循环的第一次迭代之后,它总是等于或大于 len(stringscompare)

将其设置为0外循环:

v = 0
while v < len(strings) and stop == False:
    x = 0
    while x < len(stringscompare) and stop == False:

其他观察:

不要在not stop 可以使用的地方使用stop == False

您可以只使用for 循环,然后中断两次:

for s in strings:
    for sc in stringscompare:
        if re.search(s, sc):
            same.append(dict)
            break
    else:
        continue
    # only reached if the inner loop broke out
    break

或使用 any() 和生成器表达式来查找第一个匹配项:

 if any(re.search(s, sc) for s in strings for sc in stringscompare):
     same.append(dict)

【讨论】:

  • 太棒了!非常感谢,我已经看了好几个小时了,我知道这会很简单!!!
  • 感谢您的观察,您的方式更加优雅!!
  • @LauraQuinn:很高兴您找到了多个有用的答案!请注意,您只能用 15 分奖励 一个 的答案。如果您知道这一点并发现 Matanoga 的回答更有帮助,那么恭喜他。 :-)
【解决方案2】:

你使用了两次相同的变量 stop 我认为你应该在循环之后将 stop 设置为 false:

strings = <list of 3 word strings> [...,...,...]
stringscompare = <list of 3 word strings to compare>
v=0, x=0
while v < len(strings) and stop == False:
    while x < len(stringscompare) and stop == False:
        if re.search(strings[v], stringscompare[x]):
            same.append(dict)
            stop = True
        x += 1
    stop = False
    v +=1

【讨论】:

    【解决方案3】:

    我会建议这样的东西..

    strings = [] # <list of 3 word strings> [...,...,...]
    stringscompare = [] # <list of 3 word strings to compare>
    
    stop = False
    
    for x in strings:
        if stop:
            break
    
        for v in stringscompare:
            if re.search(v, x):
                stop = True
                break
    

    for 循环在这里似乎更合适。这是你想要达到的目标吗?

    【讨论】:

      【解决方案4】:

      这里的代码最明显的问题是,一旦内部循环完成,您就不会再次将 X 的值设置为 0。我会解释: 假设'strings'和'stringscompare'的长度都是3。当你第一次进入大while循环时,v=0和x=0。 当我们进入第二个循环时,x=0。当我们离开第二个循环时,如果没有找到匹配,x = length(stringscompare) = 3。

      现在,当我们返回第一个 while 循环时,它实际上确实再次进入循环内部 - 但它什么也不做,因为无法满足第二个循环的子句 - X 仍然是 3!

      您可以通过在循环 2 结束时重置 X 来解决此问题:

      strings = <list of 3 word strings> [...,...,...]
      stringscompare = <list of 3 word strings to compare>
      v=0, x=0
      while v < len(strings) and stop == False:
          while x < len(stringscompare) and stop == False:
              if re.search(strings[v], stringscompare[x]):
                  same.append(dict)
                  stop = True
              x += 1
          x = 0 #resetting X
          v +=1
      

      您可以通过调试轻松跟踪此类问题。有很多调试方法,它真的是一门艺术:P 我会为你推荐什么:

      1. 如果你在使用 Eclipse、PyCharm 等,你可以使用内置的调试器,非常棒。您可以通过添加断点在程序的任何点停止,查看所有变量的值等。 例如,在这种情况下,我会在第一个循环语句('while v

      2. 打印是您的朋友。像这样简单的东西,例如:

      v=0, x=0 
      while v < len(strings) and stop == False:
        print "About to enter second loop..."
        while x < len(stringscompare) and stop == False:
            if re.search(strings[v], stringscompare[x]):
                same.append(dict)
                stop = True
            x += 1
        v +=1
      

      您还可以打印变量的值 btw。

      还有许多其他方法可以做您想做的事情(三角图、高级搜索方法、可能更复杂的数据结构等)。但就目前而言——我认为对你来说最好的办法是以最直接的方式解决问题——专注于编写高质量的代码(命名变量、缩进、cmets 等)。令人讨厌的“顶级性能”尖端技巧将在稍后出现:)

      祝你好运,玩得开心!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-24
        • 1970-01-01
        • 2023-03-10
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多