list assignment index out of range in Python?

6 Antworten

Jetzt gibt's hier so viele gute Teilantworten, dass ich mal zusammenfasse:

  • Eine Liste erweitert man mit der append()-Methode, nicht mit einem neuen Index. Generell arbeitet man in Python nicht so oft mit Indizes, wenn es sich vermeiden lässt.
  • Das with-Statement sorgt dafür, dass der Filedeskriptor geschlossen wird, ganz automatisch.
  • Du kannst dir ein paar Zwischenschritte ersparen. Es ist z.B. nicht nötig, erstmal alle Zeilen in ein großes Array zu schieben. Um über die Zeilen zu iterieren, kann man direkt den Filedeskriptor verwenden, und das wird auch so empfohlen.

Dein Programm lässt damit schon mal deutlich verkürzen:

car = []
with open('data.txt') as f:
   for line in f:
       car.append(line.split(':'))

Wenn wir ganz elegant sein wollen, können wir das mit einem typischen Python-Idiom sogar weiter reduzieren, einer list comprehension:

with open('data.txt') as f:
   car = [line.split(':') for line in f]

Die Fehlermeldung bekommst du, weil die Liste die Länge 0 hat.

Du kannst eine Liste nicht erweitern, indem du einfach auf einen nichtexistenten Index schreibst. Dafür gibt es append oder den Plus-Operator. Der "counter" ist unnötig.

Das f.close() kannst du dir übrigens auch sparen - dafür hast du das with-Schlüsselwort, das das automatisch bei Verlassen des Blocks erledigt.

hier übrigens die erklärung warum es nicht so geht wie du denkst , sondern so wie ich schon geantwortet habe

https://stackoverflow.com/questions/5653533/why-does-this-iterative-list-growing-code-give-indexerror-list-assignment-index

aber in kurz ,

du kannst nicht mit blabla = [] etwas einrichten und dann einfach so tun als hätte es unendlich viele indexe

blabla = [] hat ein leeres element als array

somit gibt es gar nicht blabla[index] , ausser vielleicht blabla[0]


alfredo153  28.09.2020, 19:00
ausser vielleicht blabla[0]

Nein. Die Liste ist leer und hat somit gar keinen gültigen Index.

2
car = []
carappend = car.append
with open('data.txt', 'r') as f:
    lines = f.readlines()
    for line in lines:
        carappend(line.split(':')) 
        counter += 1
    f.close()

Einerseits kann man nicht einfach ein Index erfinden, das noch nicht existiert. Man kann aber mit bspw. append eins anhängen.

Andererseits sollte man Punkte in einer großen Schleife vermeiden, also weißt man die Funktion/Methode vor der Schleife einer Variablen zu.


alfredo153  29.09.2020, 06:17
Andererseits sollte man Punkte in einer großen Schleife vermeiden, also weißt man die Funktion/Methode vor der Schleife einer Variablen zu.

Das ist eine völlig übertriebene Mikrooptimierung, die das Programm nur länger und weniger lesbar macht. Die eine Attributauflösung ist nichts im Vergleich zum eigentlichen append() und split(), die in der Schleife passieren (und dem readlines() davor sowieso). Über sowas kann man sich Gedanken machen, wenn man die letzten 3% Performance herauskitzeln muss - und dann ist es sinnvoller gleich eine list comprehension zu bauen:

car = [line.split(':') for line in lines]

Dein Programm wird's übrigens auf die Nase hauen, weil es den counter gar nicht mehr gibt. Dafür kann man das f.close() einsparen, with sei Dank. Und wir landen bei einem sehr kompakten und immer noch gut lesbaren:

with open('data.txt') as f:
    lines = f.readlines()
    car = [line.split(':') for line in lines]
1
alfredo153  29.09.2020, 06:28
@alfredo153

(Was man natürlich auch noch weiter eindampfen könnte, aber wir spielen hier kein Code-Golf...)

0
Kreasteve  29.09.2020, 06:52
@alfredo153

Ja da habe ich leider nicht mehr aufgepasst, was ich kopiert habe.

Den Rest muss ich mal testen und verinnerlichen. 😊👍

1

dein beispiel scheint nicht riuchtig zu sein

den zeile 4 ist was anderes .

kann es sein das du da beim umschreiben was korrigiert hast was eigentlich falsch ist .