为什么更新字典会从我的嵌套数组中删除其余字典?

Why does updating a dictionary remove the rest of the dictionaries from my nested array?

我有一个 json 文件,其中的播放器结构如此

[
  {
    "Player_Name": "Rory McIlroy",
    "Tournament": [
      {
        "Name": "Arnold Palmer Invitational presented by Mastercard",
        "Points": "68.10",
        "Salary": "12200.00"
      },
      {
        "Name": "World Golf Championships-Mexico Championship",
        "Points": "103.30",
        "Salary": "12200.00"
      },
      {
        "Name": "The Genesis Invitational",
        "Points": "88.60",
        "Salary": "12200.00"
      },
      {
        "Name": "Farmers Insurance Open",
        "Points": "107.30",
        "Salary": "12200.00"
      },
      {
        "Name": "World Golf Championships-HSBC Champions",
        "Points": "138.70",
        "Salary": "12400.00"
      },
      {
        "Name": "The ZOZO Championship",
        "Points": "103.40",
        "Salary": "12300.00"
      }
    ]
  }]

当我运行这段代码

import json
import numpy as np
import pandas as pd
from itertools import groupby

# using json open the player objects file and set it equal to data
with open('Active_PGA_Player_Objects.json') as json_file:
    data = json.load(json_file)

with open('Players_DK.json') as json_file:
    Players_DK = json.load(json_file)

results = []

for k,g in groupby(sorted(data, key=lambda x:x['Player_Name']), lambda x:x['Player_Name']): 
    results.append({'Player_Name':k, 'Tournament':[i['Tournament'][0] for i in g]})

for obj in results:
    for x in Players_DK:
        if obj['Player_Name'] == x['Name']:
            obj['Average'] = x['AvgPointsPerGame']

i = 0
points_results = []
while i < len(results):
    j = 0
    while j < len(results[i]['Tournament']):
        difference =  (int(float(results[i]['Tournament'][j]['Points'])) -  (results[i]['Average']))
        points_results.append(round(difference,2))
        j += 1
    i += 1

with open('PGA_Player_Objects_w_Average.json', 'w') as my_file:
    json.dump(results, my_file)

我的列表是这样返回的

[{
    "Player_Name": "Rory McIlroy",
    "Tournament": [
      {
        "Name": "Arnold Palmer Invitational presented by Mastercard",
        "Points": "68.10",
        "Salary": "12200.00"
      }
    ],
    "Average": 96.19
  }]

有人可以向我解释为什么当我更新特定词典时它会删除嵌套 Tournament 列表中除第一个值以外的所有值吗?我的目标是将每个球员的平均值添加到他们相应的字典中,这样我就可以取每个平均值并从每个分数中减去它。当我尝试这样做时,虽然我只能对列表中剩下的一个值执行它。

就其价值而言,我会回过头来认真思考每一行的真正作用。您还通过调用变量 objx 让事情变得更难。可以像这样计算平均值:

for player in data: # data is poorly named, try players or players_data
    player['Average'] = sum(float(tourny['Points']) for tourny in player['Tournament']) / len(player['Tournament'])
    for tourny in player['Tournament']:
        tourny['Difference'] = float(tourny['Points']) - float(player['Average'])

留给你:

{'Player_Name': 'Rory McIlroy', 
 'Tournament': [{
     'Name': 'Arnold Palmer Invitational presented by Mastercard', 
     'Points': '68.10', 
     'Salary': '12200.00', 
     'Difference': -33.46666666666667},
    {
     'Name': 'World Golf Championships-Mexico Championship', 
     'Points': '103.30', 
     'Salary': '12200.00', 
     'Difference': 1.7333333333333343}, # .....etc 
  'Average': 101.566666666666666
}

当您在代码中使用名称来描述它们所代表的内容时,大量优化立即变得显而易见。试一试!