私は値の巨大な辞書を持っているとしましょう。 (ここに値があります。フォーマットを気にしてください。it's not detailed)同じ名前のすべてのキーを取得してPythonの別の辞書に入れる方法
とにかく、同じ名前の複数のキーがありますが、それらは別々の場所にありますが、本当に必要なのは、上記のキーから値を取得して一緒に追加することです。 totalSessionsLostとtotalSessionsWon
私は値の巨大な辞書を持っているとしましょう。 (ここに値があります。フォーマットを気にしてください。it's not detailed)同じ名前のすべてのキーを取得してPythonの別の辞書に入れる方法
とにかく、同じ名前の複数のキーがありますが、それらは別々の場所にありますが、本当に必要なのは、上記のキーから値を取得して一緒に追加することです。 totalSessionsLostとtotalSessionsWon
ここでは、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
は、ここでそれを行うための一つの方法です:
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}
>>>
、しかしこのように辞書がネストされていると、オブジェクト指向の表現ではもっとうまくいくでしょう。ここにはいくつかのセマンティクスのレイヤーがあるように見えます。名前を付けてより明確に関係を定義すると、それらを扱う方がはるかに簡単です
これにより、それぞれにコードを書くことができますテスト、保守が容易なこの種のレポートを処理するレイヤー
StackOverflowへようこそ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [on topic](http://stackoverflow.com/help/on-topic)および[How to Ask](http://stackoverflow.com/help/how-to-ask)をここで適用してください。 StackOverflowは、デザイン、コーディング、リサーチまたはチュートリアルサービスではありません。 – Prune
最適なコーディング試行で小さな例を投稿してください。入力および出力ごとのガイドラインに従ってください。 – Prune