IndexError: list 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
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

Hallo,
bei mir stimmt etwas nicht und zwar,ich bekomme Fehlermeldung:
"op.setOperationData(1.,tAirIn, 0.05, tLiqIn)
IndexError: list index out of range" im Programm:

Code: Alles auswählen

op = []
op.append(operationData(humidAir, 0., GlysantinG48, 0.4))
tLiqIn = 50.
tAirIn = 20.
#

for i in range(2):
    op[i].setOperationData(1.,tAirIn, 0.05, tLiqIn)
    co.setTurbulatorModel('shah')
    co.setFinModel('junqiWengfeng')
#
    co.calculateHeatTransfer('eNtu', op[i])
    print co.Q, co.hA, op[i].tAirOut,op[i].tLiqOut
Etwas stimmt hier nicht.
BlackJack

@anika_20: Du versuchst ganz offensichtlich auf ein Element der Liste `op` zuzugreifen das es nicht gibt. Wenn Du in eine Liste *ein* Element steckst, kannst Du halt nicht auf ein nicht-existentes *zweites* Element zugreifen.

Wobei hier die Verwendung eines Index schon keine gute Idee ist. Warum der Umweg? Warum nicht *direkt* über die Elemente der Liste iterieren?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@anika_20: Dein Thema hat - außer dem selben Fehler - nichts mit dem Posting des OP zu tun. Bitte lege für so etwas doch eher ein eigenes Thema an :-)

Zu Deinem Problem: Lass Dir doch mal direkt nach Zeile 7 den Wert von ``i`` ausgeben. Dann lass Dir vor der Schleife einmal alle Einträge von ``op`` ausgeben. Nun wirst Du feststellen, dass Du in der Schleife einen Index generierst, für den es einfach kein Element in der Liste gibt - und dann beschwert sich Python eben.

Deine Schleife stellt in Python übrigens einen Anti-Pattern dar: Man kann *direkt* über die Elemente einer Liste iterieren; dann braucht man keinen künstlichen Index mehr:

Code: Alles auswählen

for item in op:
    # item ist hier im Rumpf das jeweilige Element in der Liste
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

Vielen Dank für die schnelle Antwort.Ich verstehe aber nicht wie definiere ich die Anzahl der Iterationsschritte,wenn ich mit "item" arbeite.So wie ich hier gemacht habe,dann schimpft er.
dank für die Hilfe,ich bin absoluter Anfänger.
Mein Programm sieht jetzt so aus,was mache ich falsch?

Code: Alles auswählen

op = []
op.append(operationData(humidAir, 0., GlysantinG48, 0.4))
tLiqIn = 50.
tAirIn = 20.
#
item=2
for item in op:

    op[].setOperationData(1.,tAirIn, 0.05, tLiqIn)
    co.setTurbulatorModel('shah')
    co.setFinModel('junqiWengfeng')
#
    co.calculateHeatTransfer('eNtu', op[])
    print co.Q, co.hA, op[].tAirOut,op[].tLiqOut
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hast du mal das offizielle Python-Tutorial durchgearbeitet? Du fragst hier nach einer absoluten Grundlage und dein Code sieht geraten aus. So funktioniert Programmieren nicht.
Das Leben ist wie ein Tennisball.
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

ich bin gerade dabei das zu lesen.Mein Problem ist,das ich leider zeitlich begrenzt bin und muss die fertige Programme bearbeiten und mich gleichzeitig informieren lassen.Mein Programm ohne zu Iterrieren sieht so aus:

Code: Alles auswählen

op = []
op.append(operationData(humidAir, 0., GlysantinG48, 0.4))
tLiqIn = 50.
tAirIn = 20.
#
op[0].setOperationData(1.,tAirIn, 0.05, tLiqIn)
co.setTurbulatorModel('shah')
co.setFinModel('junqiWengfeng')
#
co.calculateHeatTransfer('eNtu', op[0])
print co.Q, co.hA, op[0].tAirOut,op[0].tLiqOut
#
op.append(operationData(humidAir, 0., GlysantinG48, 0.4))
op[1].setOperationData(1., op[0].tAirOut, 0.05, op[0].tLiqOut)
#
co.calculateHeatTransfer('eNtu', op[1])
print co.Q, co.hA, op[1].tAirOut,op[1].tLiqOut
#
op.append(operationData(humidAir, 0., GlysantinG48, 0.4))
op[2].setOperationData(1., op[1].tAirOut, 0.05, op[1].tLiqOut)
#
co.calculateHeatTransfer('eNtu', op[2])
print co.Q, co.hA, op[2].tAirOut,op[2].tLiqOut
Ich habe versucht das mit der Schleife zu lösen,hat aber leider nicht funktioniert.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Dein erster Versuch war schon fast richtig, so sollte es gehn:

Code: Alles auswählen

op = []
op.append(operationData(humidAir, 0., GlysantinG48, 0.4))
tLiqIn = 50.
tAirIn = 20.
     
for i in range(len(op)):
    op[i].setOperationData(1.,tAirIn, 0.05, tLiqIn)
    co.setTurbulatorModel('shah')
    co.setFinModel('junqiWengfeng')
    
    co.calculateHeatTransfer('eNtu', op[i])
    print co.Q, co.hA, op[i].tAirOut,op[i].tLiqOut
Was dann hier diskutiert wurde, war nicht Dein Fehler, sondern Stilfragen, das hier ist mehr Pythonic:

Code: Alles auswählen

op = []
op.append(operationData(humidAir, 0., GlysantinG48, 0.4))
tLiqIn = 50.
tAirIn = 20.
     
for opItem in op:
    opItem.setOperationData(1.,tAirIn, 0.05, tLiqIn)
    co.setTurbulatorModel('shah')
    co.setFinModel('junqiWengfeng')
    
    co.calculateHeatTransfer('eNtu', opItem)
    print co.Q, co.hA, opItem.tAirOut,opItem.tLiqOut
Brauchst Du beides, guten Stil und die Zählvariable, dann geht das so

Code: Alles auswählen

op = []
op.append(operationData(humidAir, 0., GlysantinG48, 0.4))
tLiqIn = 50.
tAirIn = 20.
     
for i, opItem in enumerate(op):
    opItem.setOperationData(1.,tAirIn, 0.05, tLiqIn)
    co.setTurbulatorModel('shah')
    co.setFinModel('junqiWengfeng')
    
    co.calculateHeatTransfer('eNtu', opItem)
    print i, co.Q, co.hA, opItem.tAirOut,opItem.tLiqOut
a fool with a tool is still a fool, www.magben.de, YouTube
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@MagBen: alle Deine Lösungen haben nichts mit dem ursprünglichen Problem zu tun.

@anika_20: erst ein Element einer Liste hinzuzufügen und dann das selbe Element immer wieder über die Liste zu referenzieren ist umständlich. Du mußt Dein Problem so umformen, dass Du immer bis auf den Inhalt der Variablen exakt das selbe tust, um es in eine Schleife packen zu können. In Deinem Fall stört das tLiq und tAir, das sich immer auf verschiedene Zustände bezieht. Indem Du sie als Variablen deklarierst und ihnen jeweils am Ende der Schleife neue Werte zuweist, kannst Du das Problem beheben:

Code: Alles auswählen

co.setTurbulatorModel('shah')
co.setFinModel('junqiWengfeng')
#
ops = []
tAir, tLiq = 20., 50.
for _ in range(3):
    op = operationData(humidAir, 0., GlysantinG48, 0.4)
    op.setOperationData(1.,tAir, 0.05, tLiq)
    co.calculateHeatTransfer('eNtu', op)
    print co.Q, co.hA, op.tAirOut,op.tLiqOut
    tAir, tLiq = op.tAirOut,op.tLiqOut
    ops.append(op)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

[quote="MagBen"]Brauchst Du beides, guten Stil und die Zählvariable, dann geht das so [...]

Code: Alles auswählen

op = [][/quote]
Bei [url=https://www.python.org/dev/peps/pep-0008]gutem Stil[/url] hieße der Bezeichner nicht [b]opItem[/b], sondern [b]op_item[/b].
Antworten