2016-03-20 17 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 

私はそれを停止することを期待した後、コードをテストしている間、私はprint文に入れ、敗者の列が期待される結果を持っていることがわかった、しかし、ループがスコアをチェックし、続けて[0]:これはコードですループの最後の反復ですでにスコア[0]を削除しています。私のループはなぜ終わらないのですか?

+3

おそらく同じスコアを持つ2つのTEMASがあるのですか? – ppperry

+1

等しいスコアは、文が真と評価される場合もどちらも意味しません。 'if score [0] == score [1]'には特殊なケースを含めるべきです。あなたはデバッグしていますか? 'スコアは本当に*が空であることを実際にチェックしましたか? – BHustus

+0

これはNBAの得点を比較しているため、1チームが勝利するまでゲームは継続的に継続されます。私がループの始めにチームの長さを印刷したときに私が気づいたことは、チームの長さが12,6、または0のときに何も印刷しなかったことでした。(6の倍数)私は理解できませんでしたこれはなぜですか、これはデバッグに役立つかもしれませんか? –

答えて

0

修正がelifに二ifのステートメントを変更することです:

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リストは最後のペアを取得する場合ということであり、第1 if文の条件はTrueですその最後のペアは削除され、両方のリストは空になります。

は、第2 if条件が評価され、しかしscoresリストは、(先行ifマッチングの礼儀)が空であるので、IndexErrorが上昇します。

elifに変更すると、最初の条件がFalseの場合のみ、2番目の条件が評価されます。ループは反復ごとに1組のチーム/スコアのみを処理し、空のテストは成功するでしょう。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の場合、何も出力されません。私はループが終了していない理由はこれと関係があると思うが、なぜ彼らは印刷されていないのか分からない。 –