2016-03-29 11 views
1

Ich habe gerade erst begonnen, Python zu lernen. Ich versuche, die niedrigste Ganzzahl in der Ziffernliste zu finden. Stattdessen ich diesen Fehler:Python für Schleife zurück IndexError: Liste Index außerhalb des Bereichs

Traceback (most recent call last): 
    File "H:/Python/untitled/08_python.py", line 32, in <module> 
    if digits[e] < temp: 
IndexError: list index out of range 

Ich weiß, dass Sie min (Ziffern) verwenden können, aber ich dachte, ich würde mein Wissen in Frage stellen, so weit. Ich habe wahrscheinlich einen einfachen Fehler gemacht und diagnostiziere ihn nicht richtig. Wenn ich 0 in die Liste wirf alles gut.

digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

low = 0 
temp = 0 
for e in digits: 
    if digits[e] < temp: 
     low = digits[e] 
    temp = digits[e] 

print(low) 
+2

'e' jede der Ziffern in der Liste ist. Sie können diese nicht einfach als Index in 'digits' wiederverwenden, Sie haben keine' digits [10] '. –

+1

Verwenden Sie einfach 'if e

Antwort

5

for e in digits iteriert über den Inhalt der Liste direkt. Sie müssen digits[e] an diesem Punkt nicht verwenden, da e bereits der Wert ist, nicht der Index. Und deshalb schlägt es fehl, da digits[10] über das Ende Ihrer Liste hinausgeht.

Weitere kleine Anmerkung - Code wird nur mit positiven Zahlen arbeiten, da Sie mit low = 0 fangen; Wenn die Liste nur Negative enthält, erhalten Sie als Ergebnis 0.
Ein Weg, dies zu vermeiden, indem sie None zu Beginn einstellen und auch für die Überprüfung:

low = None 
for e in digits: 
    if low is None or low < e: 
     low = e 
print(low) 
+0

Danke, ich wusste nicht, wie man eine ganze Zahl deklariert, da keine – rscarth

+1

Python ist dynamisch typisiert; Sie müssen keine Variablen deklarieren, und Sie können verschiedenen Typen denselben Namen zuweisen. 'low' ist keine ganze Zahl oder eine' None', es ist nur ein Name, der sich auf eines dieser Dinge bezieht. [Hier] (http://nedbatchelder.com/text/names.html) ist ein wirklich guter Artikel dazu. – tzaman

+1

@RylandScarth: Der Code deklariert nichts. Python-Variablen kümmern sich nicht um den Objekttyp, der ihnen zugewiesen ist. 'low = None' ist * nur eine Zuweisung, keine Deklaration *. Also wird zuerst 'niedrig' an das 'None'-Objekt gebunden, später wird es an eine Ganzzahl gebunden, und die Variable interessiert sich nie dafür. Sie können später eine Zeichenfolge zuweisen, wenn Sie möchten. –

2

for e in digits grob übersetzt:

for i in range(0, len(digits)): 
    e = digits[i] 

So Ihr Code wird:

for i in range(0, len(digits)): 
    if digits[digits[i]] < temp: 

Wenn:

  • i == 0, Ziffern [i] == 1, & Ziffern [digits [i]] == 2
  • i == 1, Ziffern [i] == 2, & Ziffern [digits [i] ] == 3
  • i == 8, Ziffern [i] == 9, & Ziffern [digits [i]] == 10
  • i == 9, Ziffern [i] == 10, & Ziffern [ Ziffern [i]] hebt IndexError

Wenn Sie inhinzufügen 0 am Anfang der Liste, dann die Identität i == digits[i] gilt für alle Indizes, und Ihr Code stürzt nicht ab, aber es macht immer noch die doppelte Indizierung, die nicht das ist, was Sie wollen.

2

Sie haben mehrere Probleme im Code:

  • Sie machen die Annahme e ein Index ist. Es ist nicht, es ist der tatsächliche Wert von Ihrer digits Liste. Ihre Liste hat Indizes von 0 bis 9, also wenn e == 10 (das letzte Element) erhalten Sie eine IndexError; Es gibt keine digits[10].

  • Sie setzen temp und low auf 0. Keiner Ihrer Werte in digits ist niedriger als 0, so dass Sie nie etwas finden werden, wo e < temp wahr ist.Sie müssen stattdessen einen sehr hohen Wert auswählen. float('inf') ist ein künstlicher "höchster" Wert (unendlich), der für solche Tests sehr gut funktioniert; beliebig Integer-Wert ist niedriger als unendlich.

  • Sie benötigen weder eine temp noch eine low Variable. Sie brauchen nur den einen oder den anderen, um zu testen, ob ein späterer Wert noch niedriger ist.

Code arbeiten, dann sieht wie folgt aus:

low = float('inf') 
for e in digits: 
    if e < low: 
     low = e 
Verwandte Themen