2016-04-16 19 views
0

私はPythonを使用しており、APIの使用を練習しています。私は基本的なリクエストと解析で成功しましたが、より複雑なプロジェクトのリストの理解には困難があります。JSONをPythonで構文解析する(逆辞書検索)

私はサーバからリクエストして辞書を取得しました。そこから、私が使用:

participant_search = (match1_request['participantIdentities']) 

は、次のようなデータを取得するためにparticipantIdentitiesキーの値を変換するには:ここ

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

私の目標は、1つのリストにsummonerIdとparticipantIdを組み合わせることです。これは通常は簡単ですが、ParticipantIdentitiesの順序はランダム化されています。だから、私が情報を求めているプレイヤーは、時にはリストで1位になり、他の時は3位になるでしょう。

私は通常のやり方のようにvar = list[0]を使用できません。

私はsummonerIdにアクセスすることができるので、私はsummonerIdというリストを検索して、どういうわけかその周りのすべての情報を収集できると思っています。たとえば、私が63523774を知っていたら、その鍵を見つけることができました。ここから、キーの親リストを見つけることは可能ですか?

ガイダンスをいただければ幸いです。

編集(明確化):

ここで私が働いているデータです:参加者のネストされた辞書 'participantIdentities' であるところのライン1691でhttp://pastebin.com/spHk8VP0

です。ここからは、10の辞書があります。これらの10種類の辞書には、2つのネストされた辞書「player」と「participantId」が含まれています。

私の目標は、summonerIdを持つ1つの辞書について、これらの10種類の辞書を検索することです。 summonerIdはサーバーにこのリクエストを行う前に私が知っているものです。

だから私は "真偽"を超えて何らかの検索方法を探しています。オブジェクト内で値が見つかった場合は、辞書全体(key:value)が指定される検索メソッド。

+0

あなたが持っている入力のより完全なサンプルと一緒に所望の出力を(掲示場合は参考になりますすでに部分的に含まれています) –

+0

申し訳ありませんjeff、私は分かりやすくするために私の作戦を修正しました – JohnSeuss

+0

あなたは本当に "どのように私は与えられた召喚者のための統計情報を取得するのですか? –

答えて

0

あなたを正しく理解しているかどうかわかりませんが、これはうまくいくのでしょうか?

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

iが検索対象のインデックスになります。

+0

これは私が作業しているデータです:http://pastebin.com/spHk8VP0希望のsummonerIdを持つネストされた辞書の参加者IDから辞書を作成しようとしています – JohnSeuss

0

あなたは辞書のウィッヒがキーとしてsummonerId Sを使用して構築するためにdictの内包表記を使用することができます。

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

これは素晴らしいです。これは実際にデータを単純化します。ここから、どのように私はそれをコーディングしますか?召喚者IDに基づいて、参加者IDが返されますか?私は '44610089'をプログラムに与えます、それは基本的に2を吐き出します。どうすればいい? – JohnSeuss

+0

編集:ありがとう、私は答えが簡単だと分かった。 print(var [key])。難しい部分はそれを整理していたので、 "検索項目"は辞書のキーでした。 – JohnSeuss

+0

私はコードを整理しようとしましたが、 'p ['participantIdentities'] ['player'] ['summonerId']:p ['participantIdentities'] ['participantId'] for match1_request} TypeError:文字列のインデックスは整数でなければならない 'どんな手がかり? – JohnSeuss

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

それはあなたのために働くかどうかを確認してください。

+0

素晴らしい作品です!さて、プレイヤーのParticipantIdを知ったので、別の問題に遭遇しました。 10の "統計"辞書があります...同じ名前です。私はどのように2番目のものを選ぶのですか? http://pastebin.com/spHk8VP0行220、391、558 ...の例を参照してください。 391行目は私が望む2番目のstat辞書です。通常これは簡単ですが、同じ名前です... – JohnSeuss

+0

@JohnSeuss本当に大きなファイルです。それがうまくいくかどうかを確認する 'results [" participants "]]' pのstats = [p ["stats"] –

0

あなたが求めているのは、「どのようにして召喚者の統計情報を取得するのですか?

participantIdsummonerIdのマッピングが必要です。

たとえば、これを知ることは役に立ちますか?

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

もしそうなら、:

# 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] 

(参照:raw dataあなたが貼り付け)