Python 3:迭代字典

时间:2016-05-26 15:25:47

标签: python json dictionary

我会创建一个更具体的标题,但我不确定如何制定我的问题。

{
   "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键/值对阻止,如果我不知道有多少条目(我称之为块),我会收到这个文件。

对不起,如果这个问题听起来很模糊,那是因为我很困惑如何解决这个问题,但请告诉我是否需要更多信息。

5 个答案:

答案 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密钥,你就可以得到它。