Seite 1 von 1

IndexError: list index out of range

Verfasst: Dienstag 24. Juni 2014, 13:45
von anika_20
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.

Re: IndexError: list index out of range

Verfasst: Dienstag 24. Juni 2014, 13:58
von 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?

Re: IndexError: list index out of range

Verfasst: Dienstag 24. Juni 2014, 13:59
von Hyperion
@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

Re: IndexError: list index out of range

Verfasst: Dienstag 24. Juni 2014, 14:17
von anika_20
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

Re: IndexError: list index out of range

Verfasst: Dienstag 24. Juni 2014, 14:32
von EyDu
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.

Re: IndexError: list index out of range

Verfasst: Dienstag 24. Juni 2014, 14:44
von anika_20
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.

Re: IndexError: list index out of range

Verfasst: Dienstag 24. Juni 2014, 15:08
von MagBen
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

Re: IndexError: list index out of range

Verfasst: Mittwoch 25. Juni 2014, 00:04
von Sirius3
@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)

Re: IndexError: list index out of range

Verfasst: Mittwoch 25. Juni 2014, 12:06
von /me
[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].