list indices must be integers, not float

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
Horst
User
Beiträge: 37
Registriert: Mittwoch 14. April 2010, 17:55

Hallo,
Ich hab da mal ne Frage. Vielleicht kann mir ja jemand helfen.
Ich mochste folgende Operation ausführen:

Code: Alles auswählen

A = []
for i in B:
    if i == 0:
        A.append(0)
    else:
        x = (B[i]-C[i])
        A.append(x)
mit B = [0, 151189146.454, 302574642.449, 453763788.903, 605149284.898, 756338431.352, 907723927.347, 1063232763.699, 1214618259.694, 1365807406.148, 1517192902.1429999, 1668382048.5969999, 1819767544.592, 1966637001.1470001, 2126465527.3989999, 2277851023.3930001]

und C = [0, 50.0, 100.0, 150.0, 200.0, 250.0, 300.0, 350.0, 400.0, 450.0, 500.0, 550.0, 600.0, 650.0, 700.0, 750.0]

Ich bekomme folgende Fehlermeldung, aus der Ich leider nicht schlau werde:

Traceback (most recent call last):
File "C:\Users\Desktop\Test.py", line 6, in <module>
x = (B-C)
TypeError: list indices must be integers, not float

Danke schonmal für eure Hilfe.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Es gibt code-tags.

Dein Problem ist, dass du ueber die Listenelemente iterierst und die sind nunmal Floats.
heiliga horsd

Ich würde das Problem mit

Code: Alles auswählen

for i in range(len(B)):
    if B[i] == 0:
        [...]
umschiffen.
Zuletzt geändert von heiliga horsd am Donnerstag 10. Juni 2010, 21:03, insgesamt 1-mal geändert.
fabi1511
User
Beiträge: 23
Registriert: Donnerstag 25. Juni 2009, 18:59

erstmal gibt es in diesem forum diese praktischen code tags (wichtig wegen den einrückungen...)
aber jetzt zu deinem Problem: lies dir doch einfach mal die fehlermeldung durch, da steht ja, dass du integers (ganze zahlen) und keine floats (Fließkommazahlen) verwenden musst... lass das '.0' einfach weg...
ACHTUNG: 50.0 ist auch vom typ float...

allerdings wird es auch dann einen fehler haben, weil deine liste einfach viel weniger als 50 einträge hat... also durchdenk dein programm nochmal
Horst
User
Beiträge: 37
Registriert: Mittwoch 14. April 2010, 17:55

Danke. So hats geklappt.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und jetzt noch in pythonisch:

Code: Alles auswählen

for i, elem in enumerate(B):
    if elem == 0:
        [...]
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

noch pythonischer wäre eigentlich:

Code: Alles auswählen

A = []
for b,c in zip(B,C):
    if b:
        A.append(b-c)
    else:
        A.append(0)
Ist auch effizienter, da das reinindizieren wegfällt.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

noch pythonischer wäre eine List Comprehension:

Code: Alles auswählen

A = [b-c if b else 0 for b,c in zip(B,C)]
BlackJack

Falls die Python-Version <3 und `B` und `C` gross sind, sollte man vielleicht noch `itertools.izip()` erwähnen.
Antworten