Kann Variable nicht als Parameter im json request nutzen

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
spa1teN
User
Beiträge: 2
Registriert: Mittwoch 11. Januar 2023, 03:46

Moin,
ich bin ziemlicher Anfänger, ist wahrscheinlich n doofer Fehler:

Ich möchte eine while loop bauen, die aus einer API erst die Anzahl der Datenpfade (ich hoffe was gemeint ist, kenne die Fachtermini nicht :)) bestimmen, dann eine Variable gegen diese Anzahl laufen lassen und aus jedem Pfad jeweils Daten ziehen und diese Auflisten:

Code: Alles auswählen

i = 0
len = (len(resp["vorgangsbezug"][0]))
top = ""
while i <= len:
	top = top + "-" + resp["vorgangsbezug"][i]["titel"] + " (" + resp["vorgangsbezug"][i]["vorgangstyp"] + ")\n"
	i += 1
Dabei erhalte ich folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/plenar/projekt/plenarbot.py", line 32, in <module>
    top = top + "-" + resp["vorgangsbezug"][i]["titel"] + " (" + resp["vorgangsbezug"][i]["vorgangstyp"] + ")\n"
IndexError: list index out of range
Wenn ich statt i z.B. 0 einsetze funktioniert das ganze, aber ich habe len mal dieselben Daten untereinander. Kann da wer helfen?
Liebe Grüße
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs.
Listen fangen mit Index 0 an und laufen dann bis Länge - 1, Du gehst aber bis zur Länge, und wenn ich das richtig sehe, auch noch bis zur falschen Länge (die vom 0ten Element). Die eingebaute Funktion `len` überdeckst Du mit der Variable `len`. Das geht hier nur gut, weil Du nur einmal `len` benutzt, und alle Deine Variablen globale Variablen sind. Sollte man aber trotzdem nicht machen.
Statt einer while-Schleife würde man eine for-Schleife verwenden.

Code: Alles auswählen

length = len(resp["vorgangsbezug"])
top = ""
for i in range(length):
    top = top + "-" + resp["vorgangsbezug"][i]["titel"] + " (" + resp["vorgangsbezug"][i]["vorgangstyp"] + ")\n"
Über einen Index iteriert man aber nicht, weil man über die Elemente der Liste direkt laufen kann:

Code: Alles auswählen

top = ""
for vorgangsbezug in resp["vorgangsbezug"]:
    top = top + "-" + vorgangsbezug["titel"] + " (" + vorgangsbezug["vorgangstyp"] + ")\n"
Statt Strings mit + zusammenzustückeln benutzt man Formatstrings:

Code: Alles auswählen

top = ""
for vorgangsbezug in resp["vorgangsbezug"]:
    top += f'-{vorgangsbezug["titel"]} ({vorgangsbezug["vorgangstyp"]}\n'
Und statt Strings immer wieder zu verlängern, benutzt man str.join:

Code: Alles auswählen

top_elemente = []
for vorgangsbezug in resp["vorgangsbezug"]:
    top_elemente.append(f'-{vorgangsbezug["titel"]} ({vorgangsbezug["vorgangstyp"]}\n')
top = "".join(top_elemente)
Und jetzt könnte man noch einen Generatorausdruck verwenden:

Code: Alles auswählen

top = "".join(
    f'-{vorgangsbezug["titel"]} ({vorgangsbezug["vorgangstyp"]}\n'
    for vorgangsbezug in resp["vorgangsbezug"]
)
spa1teN
User
Beiträge: 2
Registriert: Mittwoch 11. Januar 2023, 03:46

Dankesehr, das hat sehr geholfen. Das meiste was da steht habe ich glaube ich auch verstanden :)
Wie gesagt, bin halt Anfänger und will dazulernen.
Antworten