while循环python中的while循环

时间:2014-09-09 09:14:38

标签: python string loops while-loop

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

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

对于某些人来说,这似乎是一个相当长的路,但我只是一个新手程序员,任何改进都将非常感激。

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

e.g。

'这是一个字符串'
'这是另一个字符串' - 不匹配
'这是一个字符串列表' - 匹配'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

4 个答案:

答案 0 :(得分:4)

您永远不会在外部循环中重置x。因此,在外部循环的第一次迭代之后,它将始终等于或大于len(stringscompare)

在外部循环中将其设置为0

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

其他观察:

请勿stop == False使用not stop

您可以使用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)

答案 1 :(得分:0)

你使用两次相同的变量停止我认为你应该在循环后将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

答案 2 :(得分:0)

我会建议像这样......

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循环似乎更合适。这是你想要实现的目标吗?

答案 3 :(得分:0)

这里代码最明显的问题是,一旦内部循环结束,你不会再将X的值设置为0。我会解释一下: 让我们说'strings'和'stringscompare'长度都是3.当你第一次进入big 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&lt; len ...')。这样,您可以很容易地看到第一个循环实际上在运行,而第二个循环就是问题所在。

  2. 印刷是你的朋友。像这样的简单例如:

  3. 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的值。

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

    祝你好运,玩得开心!