2016-03-20 35 views
-3

Bir eylem yapmak için Python'da bir süre döngü kullanıyorum. Ancak, beklediğim zaman döngü sona ermez (takımlar boşaldığında). Bu kod: Ben bunu durdurmak için bekliyoruz sonra kod test ederken, ben baskı tablolara koymak ve kaybedenler dizi beklenen sonucu vardır bulundu Döngü neden durmuyor anlamıyor

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 

Ancak döngü puanları kontrol ediyor [0] Döngünün son yinelemesinde puanları [0] zaten sildiğimde. Döngüsüm neden bitmiyor?

+3

Belki eşit puana sahip iki Temas vardır? – ppperry

+1

Eşit puanlar, ifade doğru olarak değerlendirilirse ne anlama gelir. Skorlar [0] == puanları [1] 'için özel bir durum eklemelisiniz. Hata ayıklıyor musunuz? Aslında 'skorların gerçekten * olduğunu kontrol ettiniz mi? – BHustus

+0

Bu, NBA puanlarını karşılaştırıyor, bu yüzden bir takım kazanana kadar oyun sürekli zamanlara gidiyor. Döngü başında takımların uzunluğunu yazdığımda fark ettiğim bir şey, takımların uzunluğu 12,6 veya 0 olduğunda bir şey basmadığıydı. (6'nın katları) Bu neden oldu, ama belki bu hata ayıklama yardımcı olabilir? –

cevap

0

düzeltme elif ikinci if deyimi değiştirmektir:

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 

sorun teams ve scores listeleri son çifti gidince olması ve ilk if açıklamada koşul True olduğunu son çift kaldırılır ve her iki liste boş olur.

Daha sonra ikinci if durum değerlendirilir ancak scores listesi (önceki if eşleme izniyle), bu nedenle IndexError yükseltilir artık boştur. Bir elif olarak değiştirmek, ikinci koşulun yalnızca ilk koşul False ise değerlendirileceği anlamına gelir. Artık döngü, yineleme başına yalnızca bir çift takım/skor işleyecektir ve boş bir team testi başarılı olacaktır.

Bu işle biraz daha net while döngüsü yapabiliriz:

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

hayattan nefret ediyorum teşekkürler –

+0

@AdlaiAbdelrazaq: sizin ayrıcalıkınız, sadece beni suçlama :) – mhawke

0

Döngü sona ermiyorsa, teams hiçbir zaman boş olmaz. Sizin varsayımınız "döngü [...] teams boş olduğunda sona ermez" yanlıştır ve muhtemelen sorunu çözmeye yönelik girişimlerinizde yanlış yönlendirilmiştir.

+0

Katılıyorum, “takımlar asla boşa kalmaz, sorumu yanlış anladım.Neden hiç boş olmadığını anlamıyorum. Bu kodu çalıştırıyorsanız: http://pastebin.com/Q1SxzFem "Ekiplerin" uzunluğu 12,6 ve 0 olduğunda hiçbir şeyin yazdırılmadığını göreceksiniz. Döngünün sona ermesinin nedeninin bununla alakası olduğundan şüphe duyuyorum, ama neden yazdırılmadıklarını anlamıyorum. –

İlgili konular