List index out of range

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

Hi zusammen,
wie der Titel schon vermuten lässt habe ich ein kleineres Problem mit einem Programm von mir.

Code: Alles auswählen

result = sum(list) / len(list)

list.sort()
print list
print 'Minimum:',list[0]
print 'Maximum:',list[-1]
print 'Durchschnit:', result

if len(list)%2 == 1:
    print 'Median:',list[(len(list)-1/2)]
else:
    low = list[len(list)/2-1]
    high = list[len(list)/2]
    print 'Median:',(float(low + high))/2
das ist der Fehler:
print 'Median:',list[(len(list)-1/2)]
IndexError: list index out of range

kleine Information noch dazu:
passiert nur wenn in der Liste grössere Zahlen eingegeben werden.
grössere anzahl 3 stelligen oder eine 7 oder mehrstellige zahl.

Ich habe mich schon an anderen Orten über den Fehler klug gemacht, aber die Tipps da haben mir nicht geholfen.
Ich hoffe hier hat einer eine Idee oder ein Auge dafür was bei dem Progi nicht stimmen könnte... Danke im Voraus

Gruss Menace
Zuletzt geändert von Anonymous am Mittwoch 10. November 2010, 19:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@menace: Lass Dir doch mal die Werte ausgeben und versuche nachzuvollziehen warum sie falsch sind. Das kannst Du mit den entsprechenden Werten einfach mal interaktiv im Python-Interpreter ausprobieren.

Das ist so auf den ersten Blick ein rein mathematisches Problem. Kleiner Hinweis: Erwartest Du bei ``1 + 2 * 3`` eine 7 oder eine 9 als Ergebnis?
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

naja, die resultate bei niedrigen zahlen sind korrekt.
und dass es 7 gibt bin ich mir bewusst ;)

ich glaube mit der rechnung per se ist nichts falsch.
aber es scheint ein problem aufzutreten sobald ich die zahlen höher wähle.

ich weis nicht ob es mit der länge der liste zu tun hat oder mit was sonst. könnte es ein reines formulierungsproblem sein?
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

zum überlegen:

Code: Alles auswählen

In [22]: def f(list):
   ....:     print len(list)
   ....:     if len(list)%2 == 1:
   ....:         print 'Median:',list[(len(list)-1/2)]
   ....:     else:
   ....:         low = list[len(list)/2-1]
   ....:         high = list[len(list)/2]
   ....:         print 'Median:',(float(low + high))/2
   ....:

In [23]: map(f, [range(i) for i in range(4,20)])
4
Median: 1.5
5
Median:---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)

C:\Python26\Lib\site-packages\<ipython console> in <module>()

C:\Python26\Lib\site-packages\<ipython console> in f(list)

IndexError: list index out of range
ausserdem ersetze die Variable 'list' durch etwas anderes, dies könnte dir sonst einmal grosse Probleme machen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Code: Alles auswählen

In [10]: l
Out[10]: [0, 1, 2, 3, 4]

In [11]: len(l)-1/2
Out[11]: 5

In [12]: l[5]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)

C:\Dokumente und Einstellungen\nelson\Eigene Dateien\<ipython console> in <modul
e>()

IndexError: list index out of range

In [13]: (len(l)-1)/2
Out[13]: 2

In [14]: l[2]
Out[14]: 2
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

tut mir leid ich bin noch ziemlich neu in python. Ich kann dir leider nicht folgen :(

die liste die ich verwende ist eine "unbegrenzte" liste in der ich mit raw_input immer wieder neue elemente hinten an die liste anfüge.
könnte die unbestimmte menge an zahlen ein problem sein?
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

ich wollte dir mit meinem Beispiel nur zeigen, dass man den Fehler relativ einfach finden kann.
Wie du siehst gibt es die Ausnahme wenn die Länge der Liste 5 ist, dh die folgende Zeile ist relevant:

Code: Alles auswählen

print 'Median:',list[(len(list)-1/2)]
Was jetzt das Problem an dieser Zeile ist, da hat dich BlackJack und jetzt auch Hyperion darauf hingewiesen.

5 - 1 / 2 ist nicht das selbe wie (5 - 1) / 2; diese Lösung ist aber mit Python >= 3 leider auch nicht mehr möglich, denn 3 / 2 gibt in Python < 3: 1 und in Python >= 3: 1.5.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@DaMutz:
Es gibt noch den "//"-Operator - der macht genau das, was "int / int" bei python 2.x macht.

Wollte ich nur wegen dem "nicht mehr moöglich" gesagt haben...
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

menace hat geschrieben:

Code: Alles auswählen

result = sum(list) / len(list)

list.sort()
print list
[...]
Noch ein Hinweis zum Code. list ist der eingebaute Name einer Python-Funktion und sollte eigentlich nicht neu für andere Zwecke definiert werden.
Antworten