我会创建一个更具体的标题,但我不确定如何制定我的问题。
{
"playerStatSummaries": [
{
"playerStatSummaryType": "AramUnranked5x5",
"aggregatedStats": {
"totalChampionKills": 2250,
"totalAssists": 6199,
"totalTurretsKilled": 114
},
"modifyDate": 1463737953000,
"wins": 211
},
{
"playerStatSummaryType": "RankedSolo5x5",
"aggregatedStats": {
"totalNeutralMinionsKilled": 928,
"totalMinionKills": 15346,
"totalChampionKills": 522,
"totalAssists": 459,
"totalTurretsKilled": 129
},
"losses": 35,
"modifyDate": 1464273041000,
"wins": 44
},
{
"playerStatSummaryType": "URF",
"aggregatedStats": {
"totalNeutralMinionsKilled": 100,
"totalMinionKills": 1379,
"totalChampionKills": 138,
"totalAssists": 125,
"totalTurretsKilled": 25
},
"modifyDate": 1463946086000,
"wins": 10
}
],
"summonerId": 85058811
}
我想迭代这个字典,直到我得到" wins":44键/值对。我需要动态到达它,因为json文件并不总是具有相同数量的条目,因此索引始终不相同。
我知道如何简单地遍历键:
for key in ranked_stats_json.keys():
if key == "playerStatSummaries":
print("reached")
但是我不知道如何再次遍历密钥,因为" playerStatSummaries"中有另一组密钥/对值。块。
我也不明白为什么这里的键/对值有多个值,例如" playerStatSummaryType:" RankedSolo5x5," aggregatedStats"。我以为每个键只能有一个值。
简而言之:如何在" RankedSolo5x5"中动态地达到"胜利":44键/值对阻止,如果我不知道有多少条目(我称之为块),我会收到这个文件。
对不起,如果这个问题听起来很模糊,那是因为我很困惑如何解决这个问题,但请告诉我是否需要更多信息。
答案 0 :(得分:0)
尝试类似:
for item in ranked_stats_json['playerStatSummaries']: ##This iterates the list
if 'wins' in item and item['wins'] == 44: ##This checks your condition
##Do whatever here, or break or whatever you want #Put your action here
考虑这个例子:
{ 'Dictvalue1':[
{
'List1key1': 'List1Value1,
'list1key2': 'list1Value2
},
{
'ListItem2key1': 'ListItem2Value1,
'listItem2key2': 'listItem2Value2
}
]}
通常在字典中,您可以按键引用,也可以按位置引用列表。嵌套时也一样。
因此,如果您想引用ListItem2Value1,您可以使用:
variable_holding_this_structure['Dictvalue1'][1]['listItem2key1']
因为键“Dictvalue1”有一个列表作为其值。在列表中,您需要位置1(列表中的第二个字典)。在列表位置1中的字典中,您需要与键'listItem2key1'相关联的值
这意味着您可以通过参考正确使用的嵌套级别或嵌套for循环来遍历任何正常级别
for item in variable['Dictvalue1'][1]:
#do something
for item in variable:
for subitem in item:
for subsubtitem in subitem:
#do something
答案 1 :(得分:0)
您可以使用List Comprehension
遍历统计信息wins = [x['wins'] for x in data['playerStatSummaries']]
print(wins)
>>> [211, 44, 10]
答案 2 :(得分:0)
在列表理解中使用if
条件:
win_dict = [{'wins': x['wins']} for x in json_data['playerStatSummaries'] if x['playerStatSummaryType'] == 'RankedSolo5x5']
# [{'wins': 44}]
答案 3 :(得分:0)
在此语法中,{}
表示字典,而[]
表示列表或数组。
您有{
开头,因此您的外部数据项是字典。主键似乎是"playerStatSummaries"
所以让我们直接访问:
data['playerStatSummaries']
现在,playerStatSummaries是一个列表/项目数组,因此我们必须迭代它,或者使用索引号。您已经说过数字/顺序会有所不同,所以我们将遍历列表。
stats = [summ for summ in data['playerStatSummaries']]
这将使用list comprehension创建一个新列表,该列表仅包含与数据结构内的列表相同的元素。但我们可以走得更远!
每个summ
项本身都是一个字典,其中包含'wins': 44
或"playerStatSummaryType": "RankedSolo5x5"
等字符。因此,我们可以使用列表推导的if clause
功能过滤掉您想要的项目:
stats = [summ for summ in data['playerStatSummaries'] if summ['wins'] == 44]
或者可能是更好的方法:
stats = [summ for summ in data['playerStatSummaries'] if summ['playerStatSummaryType'] == 'RankedSolo5x5']
现在,您将拥有44胜的所有元素的列表,或类型为RankedSolo5x5
的元素。
最有可能的是,你只有一个元素。您可以保留列表,并按以下方式访问:
wins = stats[0]['wins']
或者你可以在理解时抓住第0个元素:
stat = [summ for summ in ... 'RankedSolo5x5'][0]
wins = stats['wins']
答案 4 :(得分:0)
您可以使用这样的递归函数:
def get_wins(obj):
wins = []
if isinstance(obj, list):
for val in obj:
if isinstance(val, (dict, list)):
return_val = get_win(val)
if return_val:
wins.extend(return_val)
elif isinstance(obj, dict):
for name, val in obj.items():
if name == 'wins':
wins.append(val)
if isinstance(val, (dict, list)):
return_val = get_win(val)
if return_val:
wins.extend(return_val)
return wins
然后,如果您使用get_wins(ranked_stats_json)
,则输出为[211, 44, 10]
。
关于这一点的好处是,无论内容如何,如果它在任何地方都有wins
密钥,你就可以得到它。