Seite 1 von 1

Liste in Liste in Json

Verfasst: Mittwoch 1. April 2020, 19:29
von Shaky79
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

Re: Liste in Liste in Json

Verfasst: Mittwoch 1. April 2020, 19:43
von __blackjack__
@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.)

Re: Liste in Liste in Json

Verfasst: Mittwoch 1. April 2020, 21:52
von Shaky79
ok, danke schonmal, aber wenn ich zum Beispiel:
for matchin data
print(match(['match_id'])

schreibe,
sagt er mir:

KeyError: 'match_id'

Re: Liste in Liste in Json

Verfasst: Mittwoch 1. April 2020, 22:01
von Sirius3
`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.