我正在尝试在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
答案 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 我会为你推荐的:
如果你使用Eclipse,PyCharm等,你可以使用内置的调试器,这是惊人的。您可以通过添加断点,查看所有变量的值等来停止程序的任何位置。 例如,在这种情况下,我会在第一个循环语句中放置一个断点('while v&lt; len ...')。这样,您可以很容易地看到第一个循环实际上在运行,而第二个循环就是问题所在。
印刷是你的朋友。像这样的简单例如:
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的值。
还有很多其他方法可以做你想做的事情(三角图,高级搜索方法,可能是更复杂的数据结构等)。但就目前而言 - 我认为对你来说最好的事情是以最直接的方式解决问题 - 专注于编写质量代码(命名良好的变量,缩进,注释等)。令人讨厌的“顶级表现”尖端技巧将在稍后出现:)
祝你好运,玩得开心!