2016-04-16 10 views
0

Ich benutze Python und "Anfragen", um die Verwendung von API zu üben. Ich hatte Erfolg mit grundlegenden Anfragen und Parsing, hatte aber Schwierigkeiten mit dem Listenverständnis für ein komplexeres Projekt.JSON in Python (Reverse-Wörterbuchsuche) analysieren

Ich habe von einem Server angefordert und ein Wörterbuch bekommen. Von dort habe ich:

participant_search = (match1_request['participantIdentities']) 

die Werte des participantIdentities Schlüssels zu konvertieren folgende Daten zu erhalten:

[{'player': 
{'summonerName': 'Crescent Bladex', 
'matchHistoryUri': '/v1/stats/player_history/NA1/226413119', 
'summonerId': 63523774, 
'profileIcon': 870}, 
'participantId': 1}, 

Mein Ziel hier ist es, die summonerId und participantId zu einer Liste zu kombinieren. Das ist normalerweise einfach, aber die Reihenfolge von ParticipantIdentities ist randomisiert. Der Spieler, auf den ich Informationen möchte, wird manchmal auf der Liste stehen, und manchmal auf der dritten.

So kann ich nicht die var = list[0] wie ich normalerweise tun würde.

Ich habe Zugriff auf die Beschwörer-ID, also denke ich, ich kann die Liste der Beschwörer-ID durchsuchen, dann sammle irgendwie alle Informationen darum herum. Zum Beispiel, wenn ich wüsste 63523774 dann könnte ich den Schlüssel dafür finden. Von hier aus ist es möglich, die Elternliste des Schlüssels zu finden?

Jede Anleitung wäre willkommen.

Edit (Klärung):

Hier ist die Daten Ich arbeite mit: http://pastebin.com/spHk8VP0

In Zeile 1691 ist, wo Teilnehmer die verschachtelte Wörterbuch 'participantIdentities' ist. Von hier aus gibt es 10 Wörterbücher. Diese 10 Wörterbücher enthalten zwei verschachtelte Wörterbücher, "player" und "participantId".

Mein Ziel ist es, diese 10 Wörterbücher nach dem Wörterbuch mit der Beschwörer-ID zu durchsuchen. Die Beschwörer-ID ist etwas, das ich bereits kenne, bevor ich diese Anfrage an den Server stelle.

Also ich suche nach einer Art "Such" -Methode, die über "wahr/falsch" hinausgeht. Eine Suchmethode, bei der, wenn ein Wert in einem Objekt gefunden wird, das gesamte Wörterbuch (Schlüssel: Wert) angegeben wird.

+0

Es wäre hilfreich, wenn Sie die gewünschte Ausgabe geschrieben (zusammen mit einem vollständigeren Probe von Eingangs Sie haben bereits teilweise enthalten) –

+0

Sorry, jeff, ich habe mein OP für Klarheit geändert – JohnSeuss

+0

Fragen Sie wirklich "Wie bekomme ich die Statistiken für einen bestimmten Beschwörer?" –

Antwort

0

Nicht sicher, ob ich Sie richtig verstanden habe, aber würde das funktionieren?

for i in range(len(match1_request['participantIdentities'])): 
    if(match1_request['participantIdentities'][i]['summonerid'] == '63523774': 
     # do whatever you want with it. 

i wird der Index für die Sie suchen.

+0

Dies sind die Daten, mit denen ich arbeite: http://pastebin.com/spHk8VP0 Ich versuche, ein Wörterbuch aus Teilnehmeridentitäten für das verschachtelte Wörterbuch mit der gewünschten Beschwörer-ID zu erstellen – JohnSeuss

0

Sie können ein dict Verständnis verwenden, um ein dict Wich zu bauen verwendet summonerId s als Schlüssel:

players_list = response['participantIdentities'] 
{p['player']['summonerId']: p['participantId'] for p in players_list} 
+0

Das ist brilliant. Dies vereinfacht die Daten wirklich. Von hier aus, wie würde ich es so kodieren, basierend auf der Beschwörer-ID, wird die Teilnehmer-ID zurückgegeben? Ich gebe '44610089' dem Programm, es spuckt im Grunde 2 aus. Wie würde ich das tun? – JohnSeuss

+0

edit: danke, ich erkannte, dass die Antwort einfach ist. Drucken (var [Schlüssel]). Der schwierige Teil war, es so zu organisieren, dass der "Suchgegenstand" ein Schlüssel in einem Wörterbuch war. – JohnSeuss

+0

Ich habe versucht, den Code aufzuräumen, aber rannte in diese, 'p ['TeilnehmerIdentitäten'] ['Spieler'] ['BeschwörerId']: p ['TeilnehmerIdentitäten'] ['TeilnehmerId'] für p in match1_request} TypeError: String-Indizes müssen ganze Zahlen sein? – JohnSeuss

0
ds = match1_request['participantIdentities'] 
result_ = [d for d in ds if d["player"]["summonerId"] == 12345] 
result = result_[0] if result_ else {} 

Prüfen Sie, ob es für Sie arbeitet.

+0

Funktioniert super! Okay, jetzt, da ich die ParticipantId des Players kenne, stieß ich auf ein anderes Problem. Es gibt 10 "stats" Wörterbücher ... Sie haben den gleichen Namen. Wie wähle ich die zweite? http://pastebin.com/spHk8VP0 siehe die Zeilen 220, 391, 558 ... für Beispiele. Zeile 391 ist das zweite Statistikwörterbuch, das ich möchte. Normalerweise ist das einfach ... aber sie haben den gleichen Namen ... – JohnSeuss

+0

@JohnSeuss Es ist eine wirklich große Datei. Sehen Sie, ob es funktioniert: stats = [p ["stats"] für p in result ["Teilnehmer"]] ' –

0

Ich denke, was Sie fragen, ist: "Wie bekomme ich die Statistiken für einen gegebenen Beschwörer?"

Sie benötigen eine Zuordnung von participantId zu summonerId.

Zum Beispiel, wäre es hilfreich, dies zu wissen?

summoner[1] = 63523774 
summoner[2] = 44610089 
... 

Wenn ja, dann:

# This is probably what you are asking for: 
summoner = {ident['participantId']: ident['player']['summonerId'] 
      for ident in match1_request['participantIdentities']} 

# Then you can do this: 
summoner_stats = {summoner[p['participantId']]: p['stats'] 
        for p in match1_request['participants']} 

# And to lookup a particular summoner's stats: 
print summoner_stats[44610089] 

(ref: raw data Sie klebte)