Python 如何遍历嵌套字典(嵌套列表中的)并将值复制到新列表中

Python 如何遍历嵌套字典(嵌套列表中的)并将值复制到新列表中,python,loops,dictionary,iteration,nested-lists,Python,Loops,Dictionary,Iteration,Nested Lists,我正在尝试对一组电子竞技游戏数据进行数据分析。数据格式如下(从json转换): 我想得到一份球员“汤姆”的名单,包括他的胜负。像这样: tom_won = [True, False] 到目前为止,我所尝试的(见下文)不起作用,所以我希望你们中的一位能够向我展示一种更好的方法 index = 0 tom_won = [] while index < len(game_data) for game_data[index]["players"][0]["w

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

我想得到一份球员“汤姆”的名单,包括他的胜负。像这样:

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
index=0
汤姆元=[]
而指数
给你:

res=[]
对于游戏中的游戏数据:
对于游戏中的玩家[“玩家”]:
如果玩家['player_name']=='Tom':
res.append(玩家['won'])
打印(res)
输出:

[True, False]

您需要遵循现有的结构:

  • 迭代外部数组中的匹配元素
  • 对于每个数组,从键
    'players'
  • 对于每个玩家,检查姓名,并检索
    姓名
    ,如果它是您正在寻找的玩家
列表理解
版本

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

下面是一种通过列表理解实现此目的的方法:

all_players = [p for m in game_data for p in m['players']]
tom = [m["won"] for m in all_players if m['player_name'] == "Tom"]
结果为
[正确,错误]

请尝试以下操作:

game_data=[{“match_id”:1,“players”:[{“player_name”:“Tom”,“won”:True},
{“玩家姓名”:“安娜”,“赢得”:假}]},
{“match_id”:2,“players”:[{“player_name”:“Tom”,“won”:False},
{“玩家姓名”:“弗雷德”,“赢了”:真的}]]
汤姆元=[]
对于游戏数据中的每场比赛:
对于每场比赛中的每位球员[“球员”]:
玩家名称=每个玩家[“玩家名称”]
如果玩家名称=“汤姆”:
tom_won.append(每个玩家[“won”])
此外,您还可以使用
defaultdict
获得所有玩家的结果:

game_data=[{“match_id”:1,“players”:[{“player_name”:“Tom”,“won”:True},
{“玩家姓名”:“安娜”,“赢得”:假}]},
{“match_id”:2,“players”:[{“player_name”:“Tom”,“won”:False},
{“玩家姓名”:“弗雷德”,“赢了”:真的}]]
导入集合
player_won=collections.defaultdict(列表)
对于游戏数据中的每场比赛:
对于每场比赛中的每位球员[“球员”]:
玩家名称=每个玩家[“玩家名称”]
玩家赢[玩家名].追加(每个玩家[“赢”])

我使用的是python2.7,但代码应该很容易更改为在python3中运行。

我建议先处理数据结构,例如:

游戏数据=[
{“match_id”:1,“results”:{“Tom”:True,“Anna”:False},
{“match_id”:2,“results”:{“Tom”:False,“Fred”:True}
]
然后,您可以使用它为一名玩家生成摘要:

>>[match['results']['Tom']用于游戏数据中的匹配]
[对,错]
这还不够,但至少更容易处理

同样有意义的是在韩元之间增加一点连贯性:

游戏数据=[
{“比赛id”:1,“获胜者”:1,“球员姓名”:[“安娜”,“汤姆”]},
{“比赛id”:2,“获胜者”:0,“球员姓名”:[“弗雷德”,“汤姆”]},
]
然后:

def结果(匹配,名称):
返回匹配['player_names'][匹配['winner']]==名称
玩家结果=[游戏数据中匹配的结果(匹配,'Tom')]
为了避免名称重复,您可能也可以使用玩家标识符:

从集合导入namedtuple
Game=namedtuple('Game',['match_id','winner','players'))
游戏数据=[
游戏(match_id=1,winner=1,players=[0,1]),
游戏(match_id=2,winner=2,players=[1,2]),
]
player_id={name:i代表i,枚举中的名称(['Anna','Tom','Fred'])}
玩家结果=[game.winner==玩家id['Tom']用于游戏中的游戏数据]
您是唯一能够真正回答“什么是最好的数据结构”这个问题的人,但我希望这会有所帮助

还请注意,您可以简单地筛选结果,以仅显示球员参与的比赛,例如,最后一个数据结构:

[game.winner == player_id['Fred'] for game in game_data if player_id['Fred'] in game.players]
这不是最干净的形式,但您可以使用迭代器首先获取玩家参与的游戏,然后获取其结果:

def player_游戏(游戏,名称):
return(如果game.players中的player_id[name],则game_数据中的game-for-game)
[game.winner==player_id['Fred']用于player_游戏中的游戏(游戏数据,'Fred')]

什么是
数据
数据[索引]
一样?我认为您应该首先研究数据结构。这将有助于简化代码。
而index
在Python中不要这样循环。您几乎总是需要一个for-loop。此任务可以轻松地拆分为单独的子任务,如遍历列表、访问dict的特定字段以及收集列表中的值。所有这些问题都曾在这里被多次询问和回答。我不认为这个问题与这些具体的输入数据将如何在未来对任何人有用,我投票结束这个问题,因为需要更多的关注。
all_players = [p for m in game_data for p in m['players']]
tom = [m["won"] for m in all_players if m['player_name'] == "Tom"]
[game.winner == player_id['Fred'] for game in game_data if player_id['Fred'] in game.players]