2017-05-19 10 views
-1

私は値の巨大な辞書を持っているとしましょう。 (ここに値があります。フォーマットを気にしてください。it's not detailed)同じ名前のすべてのキーを取得してPythonの別の辞書に入れる方法

とにかく、同じ名前の複数のキーがありますが、それらは別々の場所にありますが、本当に必要なのは、上記のキーから値を取得して一緒に追加することです。 totalSessionsLostとtotalSessionsWon

+2

StackOverflowへようこそ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [on topic](http://stackoverflow.com/help/on-topic)および[How to Ask](http://stackoverflow.com/help/how-to-ask)をここで適用してください。 StackOverflowは、デザイン、コーディング、リサーチまたはチュートリアルサービスではありません。 – Prune

+1

最適なコーディング試行で小さな例を投稿してください。入力および出力ごとのガイドラインに従ってください。 – Prune

答えて

1

ここでは、j.jsonファイルを読み取り、dictを読み取ることができるソリューションの例を示します。あなたのファイル:

PS:

この種のコードは、形式のこの種のファイルのデータを合計することができます

{...,key1:[{..., key2:{...keys_of_elements_to_sum...}}, {..., key3:{...keys_of_elements_to_sum...}}, ...]}

ので、ここのコードは次のとおりです。

from ast import literal_eval 
from itertools import groupby 

def get_sum_of_repeated_keys(data): 
    keys = [] 
    for k in data: 
     # check the key is a list 
     if isinstance(data[k], list): 
      # if the key is a list 
      # We'll parse all the list's elements 
      for j in data[k]: 
       # if the elements of the previous list 
       # are dicts 
       if isinstance(j, dict): 
        # parse the keys of the list's dicts 
        for m in j: 
         # If the elements of the previous list's dicts are dicts 
         if isinstance(j[m], dict): 
          # Appends the items to the list called keys 
          keys += j[m].items() 

    # return a dict with the sum of the groupped elements by key 
    return {k:sum(k[1] for k in list(v)) for k, v in groupby(sorted(keys), lambda x: x[0])} 

# Read the JSON file and convert it into a python dict 
with open('j.json', 'r') as f: 
    a = f.read().rstrip("\n") 
    # This code uses 'literal_eval' 
    # because your input file isn't a valid JSON file 
    data = literal_eval(a) 

# The final result 
final = get_sum_of_repeated_keys(data) 
# list the keys of the final result 
# print(final.keys()) 
# Print an elements using its key 
print("Total sessions won:", final['totalSessionsWon']) 
print("Total sessions lost:", final['totalSessionsLost']) 

出力:

Total sessions won: 132 
Total sessions lost: 122 
1

は、ここでそれを行うための一つの方法です:

subdicts = huge_dict_of_values['champions'] 
keys = subdicts[0]['stats'].keys() # assuming that no dict has keys that this one doesn't have, for simplicity 
totals = {key: sum([subdict['stats'][key] for subdict in subdicts] for key in keys])} 

出力:一般的に

>>> totals 
{'totalPhysicalDamageDealt': 16313032, 'totalTurretsKilled': 316, 'totalSessionsPlayed': 254, 'totalAssists': 2208, 'totalDamageDealt': 31926510, 'totalQuadraKills': 2, 'totalPentaKills': 0, 'mostSpellsCast': 0, 'totalDoubleKills': 178, 'maxChampionsKilled': 450, 'totalDeathsPerSession': 1842, 'totalSessionsWon': 132, 'totalGoldEarned': 3064958, 'totalTripleKills': 26, 'totalChampionKills': 1730, 'maxNumDeaths': 485, 'totalMinionKills': 36376, 'totalMagicDamageDealt': 12982770, 'mostChampionKillsPerSession': 450, 'totalUnrealKills': 0, 'totalDamageTaken': 5812772, 'totalSessionsLost': 122, 'totalFirstBlood': 0} 
>>> 

、しかしこのように辞書がネストされていると、オブジェクト指向の表現ではもっとうまくいくでしょう。ここにはいくつかのセマンティクスのレイヤーがあるように見えます。名前を付けてより明確に関係を定義すると、それらを扱う方がはるかに簡単です

これにより、それぞれにコードを書くことができますテスト、保守が容易なこの種のレポートを処理するレイヤー

関連する問題