【问题标题】:How to parse key values from nested dictionaries in this example?在此示例中,如何解析嵌套字典中的键值?
【发布时间】:2016-01-22 22:07:50
【问题描述】:

请查看下面从 API 获取的 JSON。

my_json =

{
     "cities":[
             {
             "portland":[
                 {"more_info":[{"rank": "3", "games_played": "5"}
                 ],
            "team_name": "blazers"
            },
            {
            "cleveland":[
                 {"more_info":[{"rank": "2", "games_played": "7"}
                 ],
            "team_name": "cavaliers"
            }
    ]
}

我想从这个 my_json 创建一个新字典,其中“team_name”作为键,“rank”作为值。

像这样:{'Blazers': 3, 'Cavaliers': 2, 'Bulls': 7}

我不知道如何做到这一点...我可以返回一个城市列表,我可以返回一个排名列表,但它们最终是两个没有关系的单独列表,我不确定如何将两者联系起来。

任何帮助将不胜感激(如果这更容易,我也愿意将这些信息组织在一个列表中,而不是 dict)。

如果我运行这个:

results_dict = {}
cities = my_json.get('cities', [])
for x in cities:
    for k,v in x.items():
        print k, v

它返回:

team_name blazers
portland [{"rank": "3", "games_played": "5"}

team_name cavaliers
cavaliers [{"rank": "2", "games_played": "7"}

【问题讨论】:

  • 第一个问题:您确定您的 JSON 有效吗?看起来不行(不是所有的括号都关闭了。
  • 是的,这看起来不像是格式正确的 json。没有它,您将无法(轻松)将其读入 python
  • 如果格式不正确,那是我自己尝试复制/粘贴的错误。 ACTUAL json 格式正确
  • 你能用正确格式的 json 更新你的问题吗?

标签: python json dictionary


【解决方案1】:

如果您想获取 cities 列表和 ranks 列表并将它们组合起来,您可以使用 zip() 和字典理解:

output = {city: rank for city, rank in zip(cities, ranks)}

【讨论】:

  • 您实际上甚至不需要明确解开压缩内容。 dict(zip(cities, ranks)) 也可以。
【解决方案2】:

有效的 JSON 如下所示:

{
    "cities":[
         {
            "portland":[
                {"more_info":
                    [{"rank": "3", "games_played": "5"}],
                "team_name":
                    "blazers"
                }
            ]
        },
        {
            "cleveland":[
                {"more_info":
                    [{"rank": "2", "games_played": "7"}],
                "team_name":
                    "cavaliers"
                }
            ]
        }
    ]
}

这部分代码返回所有你想要的,但我会尝试编写更具可读性的代码而不是这个:

results_dict = {}
cities = my_json.get('cities', [])
for x in cities:
    for k,v in x.items():
        for element in v:
            team = element.get('team_name', '')
            meta_data = element.get('more_info', [])
            for item in meta_data:
                rank = item.get('rank')
                results_dict.update({team: rank})

>>> results_dict
{'blazers': '3', 'cavaliers': '2'}

【讨论】:

  • team = element.get('team_name', '') AttributeError: 'str' object has no attribute 'get'
  • 你能打印elementkv吗?为了更好地理解您的 JSON(因为它是无效的)。也许我对你的结构的理解有点不同
  • 我更新了 k、v 的返回值。现在将尝试使用元素
  • @user5828105,您的 JSON 确实无效。那是什么? cavaliers [{"rank": "2", "games_played": "7"} 没有右括号的列表?只是为了仔细检查它是否采用有效格式,您可以尝试:import json;json.dumps(my_json)。如果它引发错误 - 这意味着 JSON 无效
【解决方案3】:

那是什么 API? JSON 结构(如果 pivanchy 正确)似乎不必要地嵌套在列表中。 (一个城市可以有多个团队吗?可能是的。但是,一个团队可以有多个排名吗?)

但对于运动来说,这里有一个巨大的字典理解来提取你想要的数据:

 { team['team_name']: team['more_info'][0]['rank']
   for ((team,),) in (
     city.values() for city in my_json['cities']
   )
 }

【讨论】:

    【解决方案4】:

    json 似乎缺少一些右括号。添加它们后,我得到了这个:

    my_json = {
                "cities": [
                    {"portland":[
                        {"more_info":[{"rank": "3", "games_played": "5"}],"team_name": "blazers"}]},
                    {"cleveland":[{"more_info":[{"rank": "2", "games_played": "7"}],"team_name": "cavaliers"}]}
                    ]
            }
    

    鉴于该结构非常嵌套,以下代码将提取您想要的数据,但非常混乱:

    结果 = {}

    for el in my_json["cities"]:  
        name = el.keys()[0]
    
        rank = el.values()[0][0]["more_info"][0]["rank"]
    
        results[name] = rank
    
    print results
    

    这会给你:

    {'portland': '3', 'cleveland': '2'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-08
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      相关资源
      最近更新 更多