IndexError: list assignment 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
kurvenschubser
User
Beiträge: 15
Registriert: Montag 10. März 2008, 01:49
Wohnort: Berlin

Montag 10. März 2008, 20:32

Guten Tag!
Könnt ihr mir nen Tip geben warum das nicht funktioniert?

Code: Alles auswählen

anteile = []
kumulanteile = []

for n in range(1, 11, 1):
    anteile[n-1] = 0
    kumulanteile[n-1] = 0
Traceback (most recent call last):
File "test2.py", line 7, in <module>
anteile[n-1] = 0
IndexError: list assignment index out of range
MfG
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 10. März 2008, 20:33

Weil du auf einen Indexwert zugreifst den es nicht gibt?!

Was willst du denn eigentlich machen?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
kurvenschubser
User
Beiträge: 15
Registriert: Montag 10. März 2008, 01:49
Wohnort: Berlin

Montag 10. März 2008, 20:42

Ich möchte die Listen mit Nullen füllen. Dann sollen in den entsprechenden Positionen der Wert per Schleife um jeweils einen gewissen Wert erhöht werden (float). Das Resultat sollte so aussehen

Code: Alles auswählen

Note:    Anteil:     Kummulierter Anteil:
1.0        0.123       0.123
1.3        0.2           0.323
  .                               .               .
  .                               .               .
  .                               .               .
5.0                              .             1.0
EDIT: Sieht bischen merkwürdig aus, die Werte sollten jeweils unter den Überschriften stehen...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 10. März 2008, 20:49

Ähem ... so wird das aber nix ;-)
Wenns nur ums Auffüllen geht ...

Code: Alles auswählen

anteile = [0]*10
kumulanteile = [0] *10
Allerdings erscheint mir Deine Struktur nicht wirklich geeignet! (Oder bekommst Du die Listen irgend wo her?)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 10. März 2008, 20:53

Code: Alles auswählen

noten = [1.0, 1.3, 5.0]
anteile = [0.123, 0.2, 0]
kumuliert = [noten +  anteil for note, anteil in zip(noten, anteile)]
# oder anders
kumuliert = map(sum, zip(noten, anteile))
My god, it's full of CARs! | Leonidasvoice vs Modvoice
kurvenschubser
User
Beiträge: 15
Registriert: Montag 10. März 2008, 01:49
Wohnort: Berlin

Montag 10. März 2008, 21:04

Die Werte (außer den Noten) waren als Beispiel gedacht.
Ich habe eine Liste mit der Häufigkeit der Noten.
In anteile soll stehen:

häufigkeit von note geteilt durch Gesamtanzahl der Noten.

In kumulanteile soll dann stehn:

kumulanteile = kumulanteile[i-1] + anteile

Ich werde erst mal mit Hyperions Tip weitermachen...

MfG
kurvenschubser
User
Beiträge: 15
Registriert: Montag 10. März 2008, 01:49
Wohnort: Berlin

Donnerstag 13. März 2008, 20:29

Es ist doch so, dass man explizit mit Nullen füllen muss oder? Sonst würde in so einer Liste automatisch von python ein zufälliger Wert gesetzt werden?

EDIT: Zur Erläuterung:

Code: Alles auswählen

anteile = [0]*11
for y in range(1, 12, 1):
    anteile[y-1] = float(notenliste[y]) / teilnehmernr
In notenliste[] stehen pro Note (es gibt 11: 1,0 1,3 1,7 2,0...5,0) die Anzahl derjenigen die diese Note erreicht haben. teilnehmernr ist die Anzahl der Klausurteilnehmer.
BlackJack

Donnerstag 13. März 2008, 21:48

Nein, es wird kein zufälliger Wert gesetzt. Das wäre ja noch schöner. Es gibt einen `IndexError` wenn man auf ein Element zugreifen will, dass es nicht gibt.

Deine Erläuterung lässt böses ahnen. Bitte fang an Python zu programmieren und höre auf BASIC, Pascal oder wo auch immer Du diese Angewohnheiten her hast, in Python schreiben zu wollen. ``for y in range(len(notenliste))`` wäre ja schon schlechter Stil, aber die Zahlen hart zu kodieren und dann auch noch unnötigerweise um 1 nach oben verschoben, ist echt gruselig.

Code: Alles auswählen

anteile = [float(n) / teilnehmer_anzahl for n in notenliste]
Antworten