Liste sortieren: index out of range

oyster-manu

oyster-manu

toast
Hallo,

ich habe diese kleine Python-Programm geschrieben welches die Usereingaben in eine Liste packt und dann sortiert ausgeben soll.

Code:
anz = input("anzahl: ") # wie viele werte eingegeben werden sollen

for i in range(anz): # so viele werte wie anzahl angeben
    x[i] = input("Bitte eine Zahl eingeben ")

x.sort()

for i in range(anz):
    print x[i]

print "programmende"

Jedoch funktioniert das nur wenn ich eine Liste mit weniger als 5 Elementen erstelle. Sobald ich anzahl = 5 setze und den 5. Wert eingebe, bricht das Programm ab:

Code:
anzahl: 6
Bitte eine Zahl eingeben 3
Bitte eine Zahl eingeben 6
Bitte eine Zahl eingeben 8
Bitte eine Zahl eingeben 2
Bitte eine Zahl eingeben 5
Traceback (most recent call last):
  File "/home/manu/eingabewerte_sortieren.py", line 7, in <module>
    x[i] = input("Bitte eine Zahl eingeben ")
IndexError: list assignment index out of range
>>>

Woran liegt das?
 
Zuletzt bearbeitet:
Normalerweise fängt bei Arrays die Zählung bei 0 an. x[0] ist das erste, x[5] das sechste und letzte Element, x[6] ungültig.
Sprich, du müsstest
Code:
x[i-1] = input("Bitte eine Zahl eingeben ")
schreiben. Andernfalls belegst du nur x[1]...x[5], und bei x[6] kommt (natürlich) der Fehler.

(Wobei ich Perl, Ruby, Phyton... nicht kenne, aber spontan fällt mir nur PL/SQL ein, wo x[1] das erste Element wäre... sollte also stimmen, was ich gerade behauptet habe ;) )
 
Zuletzt bearbeitet:
Hi,

im Allgemeinen ist es hilfreich wenn du in diesem Forum dazu schreiben wuerdest um welche Programmiersprache es sich handelt. Jeder der Python kennt sieht das natuerlich sofort, netter ist es trotzdem, vor allem fuer Leute die kein Python kennen.

Du hast in deinem Code Auszug die Variable x nicht initialisiert, aber genau der Teil ist der Knackpunkt. Du kannst eine Liste nicht erweitern indem du einer belibiegen Position einen Wert zuweist. Bei Listen muss das natuerlich via list.append() geschehen, die direkte Zuweisung funktioniert nur bei dictionaries.

Edit: @daboss
Du hast Recht dass die Indizierung bei 0 beginnt, aber dafuer sorgt bereits die Funktion range().

mfg,
bytepool
 
Hatte in der Eile diesen Post zu schreiben ganz vergessen um welche Sprache es sich handelt. T'schuldigung!

Du hast in deinem Code Auszug die Variable x nicht initialisiert, aber genau der Teil ist der Knackpunkt. Du kannst eine Liste nicht erweitern indem du einer belibiegen Position einen Wert zuweist. Bei Listen muss das natuerlich via list.append() geschehen, die direkte Zuweisung funktioniert nur bei dictionaries.

Ich dachte durch "anzahl = input("anzahl: ") " und die erste for-Schleife ist die Länge der Liste so definiert, dass sie genau so lang ist, wie anzahl vorgibt.
Wenn ich nun eine Liste brauche, dessen Länge ich nicht kenne (sie wird ja vom Benutzer festgelegt), reicht es dann die Liste mit x=[0]*anzahl zu definieren? Dann enthält die Liste zunächst nur Nullen, die dann durch weitere Benutzereingaben durch andere Werte ausgetauscht werden.

Wäre es dann so korrektes Python?
Code:
anzahl = input("anzahl: ") # wie viele werte eingegeben werden sollen

x=[0]*anzahl

for i in range(anzahl): # so viele werte wie anzahl angeben
    x[i-1] = input("Bitte eine Zahl eingeben ")

x.sort()

for i in range(anzahl):
    print x[i]

print "programmende"

Es scheint keinen Unterschied zu machen, ob ich x oder x[i-1] in der ersten for-Schleife wähle.
 
Zuletzt bearbeitet:
ohne python zu kennen, glaube ich, dass der Fehler in deinen for-Schleifen liegt.
wenn du ein Array mit 5 Elementen hast, sind die Stellen 0-4 beschrieben. Also solltest du
"for i in range(anzahl -1)" gehen, oder du sagst gleich array.length.

das mit der Anzahlabfrage könntest du dir ersparen, indem du sagst:
(nur Pseudocode)
Code:
while input == "" //mache solange die Eingabe gleich leer ist (also nur enter) 
  do
  x =  input("zahl eingeben") 
  x.push  //weiß nicht, wie eine Funktion in python heißt, die ein Element (=X) in das Array packt.

array.sort
print array

hoffe geholfen zu haben.
adieu
 
Hi,

ich glaube du hast da einiges grundlegend nicht verstanden. Eine Liste ist kein Array! Du kannst Listen wie Arrays benutzen, die Liste muss dann aber entsprechend initialisiert sein. Ich sehe den Sinn nicht, die Liste erst mit Nullen zu initialisieren, auch wenn es moeglich ist. Eine Liste ist eine dynamische Datenstruktur. Die Loesung habe ich dir schon geschrieben, im Original Code musst du nur eine Zeile anpassen. Aus
Code:
x[i] = input(foo)
mach
Code:
x.append(input(foo))

Wieso du jetzt ploetzlich [i-1] schreiben willst ist mir schleierhaft. Damit bekommst du erst Recht Probleme, dann faengt dein Index bei -1 an. Auch bei deinem zweiten Stueck Code hast du vergessen x = [] voranzustellen.

Edit: @juan_
Nein, das war schon richtig so, die range() Funktion ist zugegebenermassen am Anfang gewoehnungsbeduerftig, aber er hat sie am Anfang schon absolut korrekt genutzt.

Edit2:
Hehe, ja, stimmt, x[-1] funktioniert in Python ja auch. ;)
Wenn du also die Liste erst mit n Elementen initialisierst und x[i-1] schreibst, wuerfelst du nur die Reihenfolge der Liste durcheinander, aber es wird funktionieren. Jedenfalls wenn du nicht darauf angewiesen bist, dass die Werte in aufsteigender Folge in der Liste eingetragen werden. x[-1] gibt dir den letzten Listeneintrag. Der erste wird der letzte sein. ;)

mfg,
bytepool
 
Zuletzt bearbeitet:
sorry,
dachte, dass ich es ohne googlen schaffe :

Code:
>> range(10)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


trotzdem überflüssig ;)
 
Ich hatte das x[i-1] von daboss.
Danke für die Tipps, hab den Code nun angepasst.
 

Ähnliche Themen

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Akonadi startet nicht mehr

dovecot und postfix Konfiguration Problem

Falsche Rechte gesetzt beim Anlegen von Ordnern via Samba-Client

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

Zurück
Oben