2016-03-20 36 views
-3

我在Python中使用while循环来执行一个操作。然而,当我期望它(当团队变空时)循环不会结束。这是代码:不明白为什么循环不停止

while teams: 
    if scores[0]<scores[1]: 
     losers.append(teams[0]) 
     teams.remove(teams[0]) 
     teams.remove(teams[0]) 
     scores.remove(scores[0]) 
     scores.remove(scores[0]) 
    if scores[0]>scores[1]: 
     losers.append(teams[1]) 
     teams.remove(teams[0]) 
     teams.remove(teams[0]) 
     scores.remove(scores[0]) 
     scores.remove(scores[0]) 
return losers 

虽然测试的代码,我把打印语句,发现失败者阵列具有所期望的结果,但循环将继续后,我希望它停下来,检查得分[0]当我已经删除循环的最后一个迭代的分数[0]。为什么我的循环没有结束?

+3

也许有两个temas相等的分数? – ppperry

+1

如果语句计算结果为true,那么等于分数将不会。你应该包括'if score [0] == scores [1]''的特例。你在调试吗?你真的检查过“分数”真的*是空的吗? – BHustus

+0

这是比较NBA的比分,所以比赛连续加班,直到一支球队获胜。我在循环开始时打印队伍长度时注意到的一件事是,当队伍长度为12,6或0时,它不打印任何东西。(6的倍数)我弄不清楚为什么这是,但也许这可能有助于调试? –

回答

0

的解决方法是第二if声明更改为elif

while teams: 
    if scores[0]<scores[1]: 
     losers.append(teams[0]) 
     teams.remove(teams[0]) 
     teams.remove(teams[0]) 
     scores.remove(scores[0]) 
     scores.remove(scores[0]) 
    elif scores[0]>scores[1]: 
     losers.append(teams[1]) 
     teams.remove(teams[0]) 
     teams.remove(teams[0]) 
     scores.remove(scores[0]) 
     scores.remove(scores[0]) 
return losers 

的问题是,当teamsscores名单到达最后一对,并在第一if语句中的条件是True,最后一对被删除,两个列表都变空了。

然后第二if评估条件,但scores列表现在是空的(如前述if匹配的提供),所以一个IndexError上升。

将其更改为elif表示仅在第一个条件为False时才会评估第二个条件。现在循环每次迭代只会处理一组球队/分数,并且空的team的测试将会成功。

你可以使while循环更清晰了一下这个:

while teams: 
    if scores[0] < scores[1]: 
     losers.append(teams[0]) 
    elif scores[0] > scores[1]: 
     losers.append(teams[1]) 
    else: 
     # this should never happen 
     print('Error: drawn match detected!') 
     losers.append(None) # or simply ignore if that makes sense 

    teams[:] = teams[2:] # remove the first 2 items 
    scores[:] = scores[2:] 
+0

我讨厌生活 谢谢 –

+0

@AdlaiAbdelrazaq:你的特权,只是不要怪我:) – mhawke

0

如果循环未结束是因为teams永远不会变空。你的假设“当teams变空时循环不会结束”是不正确的,可能会误导你试图解决问题。

+0

我同意,“团队”永远不会变空,我说错了我的问题。我不明白为什么它永远不会变空。 如果您运行以下代码:http://pastebin.com/Q1SxzFem 您将会看到,当'teams'的长度为12,6和0时,不会打印任何内容。我怀疑循环没有终止的原因与此有关,但我不明白他们为什么没有被打印出来。 –