首页 > 解决方案 > 如何遍历嵌套字典(在嵌套列表中)并将值复制到新列表中

问题描述

我正在尝试对一组电子竞技游戏数据进行一些数据分析。数据格式如下(从json转换而来):

game_data = [{"match_id":1, "players":[{"player_name":"Tom", "won":True},
                                       {"player_name":"Anna", "won":False}]}, 
             {"match_id":2, "players":[{"player_name":"Tom", "won":False},
                                       {"player_name":"Fred", "won":True}]}]

我想得到一个包含他的赢和输的球员“汤姆”的名单。像这样:

tom_won = [True, False]

到目前为止我所尝试的(见下文)都不起作用,所以我希望你们中的一个人能够向我展示一种更好的方法。

index = 0
tom_won = []

while index < len(game_data)
   for game_data[index]["players"][0]["won"] in data[index]:
      if game_data[index]["players"][0]["player_name"] == "Tom":
         tom_won.append(game_data[index]["players"][0]["won"])

   for game_data[index]["players"][1]["won"] in data[index]:
      if game_data[index]["players"][1]["player_name"] == "Tom":
         tom_won.append(game_data[index]["players"][1]["won"])
   index += 1

标签: pythonloopsdictionaryiterationnested-lists

解决方案


您需要遵循您拥有的结构:

  • 迭代外部数组中的匹配元素
  • 对于每个数组,从 key 给定的数组中迭代玩家'players'
  • 为每个玩家检查名称,并检索name它是否是您正在寻找的玩家。
def get_won(data, name):
    result = []
    for match in data:
        for player in match['players']:
            if player['player_name'] == name:
                result.append(player['won'])
  return result

print(get_won(game_data, 'Tom'))  # [True, False]
print(get_won(game_data, 'Fred')) # [True]
print(get_won(game_data, 'Anna')) # [False]                                   

List-comprehension版本

def get_won(data, name):
    return [player['won'] for match in data for player in match['players'] 
                                            if player['player_name'] == name]

推荐阅读