Liste erzeugt Fehlermeldung

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
diemaka
User
Beiträge: 2
Registriert: Donnerstag 4. April 2024, 20:31

Hi, Fans,

ich habe folgenden Code programmiert. Dabei ist TilgPlan eine Liste (Array) mit 116 Zeilen u 4 Spalten (=Monatswerte)

liste=[]
# hilfe=TilgPlan[20] # hier grht es! [98427.46, 976.34, 123.78, 98301.89]
# hilf=hilfe[3] # hier geht es! 98301.89
for k in range(0,Periode):
hilfe=TilgPlan[k]
hilf=hilfe[3] # Fehlermeldung 'int' object is not subscriptable
liste.append(hilf)

Ich verstehe nicht, warum das ausserhalb der Schleife geht, innerhalb nicht, obwohl es derselbe Code ist.
Wer kann mir helfen?
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Bitte verwende die Code Tags. Die erscheinen automatisch, wenn du im vollständigen Editor den </> Button drückst. Dazwischen gehört der Code, damit die Einrückung erhalten bleibt.

Bitten verwende vernünftige Namen. Das hilft jedem der deinen Code liest - und dir. Denn ich glaube das ist ein Zeil des Problems.
Oder wie die Fehlermeldung sagt: "hilfe" ist ein Integer. Da funktioniert das mit den eckigen Klammern nicht.
Ob Hilfe eine Zahl sein soll, kann man bei dem Namen eher nicht herleiten. Bei hilf auch nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@diemaka: `TilgPlan` ist offenbar eine Liste mit Zahlen und nicht eine Liste mit Listen mit jeweils vier Elementen. Oder zumindest ein Element ist eine ganze Zahl.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
diemaka
User
Beiträge: 2
Registriert: Donnerstag 4. April 2024, 20:31

TilgPlan ist eine Liste mit (116) Elementen, wobei jedes Element eine Liste mit 4 float-Zahlen ist. So wurde es vorher berechnet und ausgegeben. Die erste Aussage ergibt sich aus der Tatsache, dass es ein Listenelement [20] ist, die zweite Aussage ergibt sich aus dem Kommentar mit den 4 Zahlen für diese Element. Das funktioniert als Zuweisung vor (!) der Schleife (jetzt auskommentiert). In der Schleife wird hilf (eine Hilfsvariable, weil man das kürzer schreiben kann) plötzlich zum int-Objekt. Und genau das verstehe ich nicht und macht Ärger.
Den (sauber geschriebenen) Code habe ich aus Python in das Eingabefenster hier kopiert, die Einrückungen sind erst nach dem Abschicken verloren gegangen!!
Aber ich denke, hier habt Ihr so viel Erfahrung, dass Ihr das auf die Reihe kriegt.
Wer hilft mir weiter?
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Das hat Sparrow Dir doch geschrieben, dass Du code-Tags verwenden mußt, damit die Einrückung im Forum erhalten bleibt.
Was sagt denn ein `print(hilfe) innerhalb der Schleife? Gibt das das aus, was Du erwartest?
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@diemaka: Wenn das so wäre wie Du behauptest würde es diese Fehlermeldung nicht geben. Vielleicht trifft das ja tatsächlich auf das Element an Index 20 zu. Auf mindestens 1 Element trifft es nicht zu. Objekte ändern nicht plötzlich ihren Typ.

Man wählt Namen nach ihrer Aussagekraft, nicht nach ihrer Länge beziehungsweise Kürze. Klar macht es Sinn bei mehreren aussagekräftigen Namen den kürzesten zu wählen, aber das kommt *nach* der Aussagekraft. Weder `hilfe` noch `hilf` sagen hier etwas sinnvolles über den Wert aus, sind also beides schlechte Namen.

`TilgPlan` und `liste` sind ebenfalls schlechte Namen. `liste` ist viel zu generisch und bei `TilgPlan` haben wir wieder eine kryptische Abkürzung. Gute Namen sind wichtig und Quelltext wird deutlich öfter gelesen als geschrieben, also ist optimieren auf wenig Tippen am falschen Ende gespart. Die Optimierung sollte beim einfachen lesen/verstehen liegen. Wobei man sich hier sowohl `hilfe` als auch `hilf` sparen kann und sollte. Man muss nicht jedes kleine Zwischenergebnis an einen Namen binden.

Dann sollte man `k` weglassen (warum überhaupt `k` und nicht `i`?) denn man kann in Python direkt über die Elemente von Sequenzen iterieren, ohne den unnötigen Umweg über einen Laufindex. Was dagegen einen Namen bekommen sollte, statt eines magischen nichtssagenden Index ist das letzte Element der inneren Listen.

Das ganze wäre dann dieser Einzeiler:

Code: Alles auswählen

    foobars = [foobar for _, _, _, foobar in tilgungs_plan[:periode]]
Mit `foobar` was auch immer der vierte Wert bedeutet und `foobars` der Mehrzahl davon. `tilgungs_plan` ist geraten und hält sich, wie auch `periode` an die konventionelle Namensschreibweise: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten