Liste in Liste in Json

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
Shaky79
User
Beiträge: 2
Registriert: Mittwoch 1. April 2020, 19:18

Hallo zusammen,

ich bin neu hier, also erstmal hallo zusammen.
Ich bin blutiger Anfänger was Python angeht aber in der Regel ein schneller "lerner" und vielleicht kann ich dann auch schnell etwas zurückgeben.
In der Coronakrise muss man sich ja seine Projekte suchen und so versuche ich gerade Daten von einer API mit Python auszulesen.

Ich nutze zum einlesen folgende Befehle:

Code: Alles auswählen

test = urllib.request.urlopen(url)
data = json.load(test)
Folgendes gibt die URL her:
[
{
"begin_at": "2020-04-01T09:00:00Z",
"detailed_stats": true,
"draw": false,
"end_at": null,
"forfeit": false,
"game_advantage": null,
"games": [
{
"begin_at": null,
"detailed_stats": true,
"end_at": null,
"finished": false,
"forfeit": false,
"id": 17248,
"length": null,
"match_id": 557804,
"position": 1,
"status": "not_started",
"video_url": null,
"winner": {
"id": null,
"type": "Team"
},
"winner_type": "Team"
},
{
"begin_at": null,
"detailed_stats": true,
"end_at": null,
"finished": false,
"forfeit": false,
"id": 17249,
"length": null,
"match_id": 557804,
"position": 2,
"status": "not_started",
"video_url": null,
"winner": {
"id": null,
"type": "Team"
},
"winner_type": "Team"
},
{
"begin_at": null,
"detailed_stats": true,
Was jetzt funktioniert ist beispielsweise mit

Code: Alles auswählen

for i in data:
    print(i['games'])
mir alle "games" anzeigen zu lassen.
Möchte ich aber zum Beispiel nun genauer auf diese Liste "Games" zugreifen und beispielsweise nur alle "match_id" Values anzeigen lassen, dann weiß ich nicht wie ich das hinbekommen soll.

Nutze ich

Code: Alles auswählen

for i in data:
print(i['games']["match_id"]
bekomme ich die Fehlermeldung

Code: Alles auswählen

TypeError: list indices must be integers or slices, not str
Kann mir hier jemand helfen? Wie gesagt bin noch komplett neu in der Materie. Wahrscheinlich muss ich die Datei noch irgendwie "umstricken"?

Gruss und Danke schonmal
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Shaky79: Nenn die Elemente bitte nicht `i` sondern verwende einen sinnvollen Namen der die Bedeutung des Wertes rüberbringt. Laufvariablen die `i` heissen sind ganze Zahlen oder sie heissen nicht `i`.

Du hast da eine Liste und gehst mit einer ``for``-Schleife die Elemente durch, die Wörterbücher sind. Dann greifst Du über einen Schlüssel auf ein Element in jedem dieser Wörterbücher zu. Das Element ist eine Liste. Ab hier solltest Du eigentlich wissen wie es weitergeht, denn das hast Du ja bereits gemacht: Eine ``for``-Schleife über die Elemente einer Liste. (Die sogar auch wieder Wörterbücher sind.)
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Shaky79
User
Beiträge: 2
Registriert: Mittwoch 1. April 2020, 19:18

ok, danke schonmal, aber wenn ich zum Beispiel:
for matchin data
print(match(['match_id'])

schreibe,
sagt er mir:

KeyError: 'match_id'
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

`data` ist eine Liste mit Einträgen, die bei Dir jetzt `match` heißen. Und dieses `match` ist ein Wörterbuch mit einem Eintrag 'games', was wiederum eine Liste ist, dessen Einträge Wörterbücher sind, die jeweils einen Eintrag 'match_id' haben. Du brauchst also zwei ineinander geschachtelten for-Schleifen.
Antworten