Python 将对象合并到一个列表中

Python 将对象合并到一个列表中,python,list,dictionary,Python,List,Dictionary,我有一个清单,上面是这样的: { "Player_Name":"Byeong-Hun An", "Tournament":[ { "Name":"Arnold Palmer Invitational presented by Mastercard", "Points":"32.80",

我有一个清单,上面是这样的:

{
   "Player_Name":"Byeong-Hun An",
   "Tournament":[
      {
         "Name":"Arnold Palmer Invitational presented by Mastercard",
         "Points":"32.80",
         "Salary":"10300.00"
      }
   ]
},
{
   "Player_Name":"Byeong-Hun An",
   "Tournament":[
      {
         "Name":"Different",
         "Points":"18.80",
         "Salary":"10400.00"
      }
   ]
}
我想要这个:

[
   {
      "Player_Name":"Byeong-Hun An",
      "Tournament":[
         {
            "Name":"Arnold Palmer Invitational presented by Mastercard",
            "Points":"32.80",
            "Salary":"10300.00"
         },
         {
            "Name":"Different",
            "Points":"18.80",
            "Salary":"10400.00"
         }
      ]
   }
]
我试过收藏,但它不能完全满足我的需求。我基本上想把每一个球员,并将所有的比赛对象组合成一个,这样每个球员都有一个对象,而不是每个事件都有自己的对象

这是我的密码

import json
    import numpy as np
    import pandas as pd
    from collections import Counter
    
    # using json open the player objects file and set it equal to data
    with open('PGA_Player_Objects.json') as json_file:
        data = json.load(json_file)
    
    points = []
    players = []
    
    for a in data:
       for b in a['Tournament']:
           points.append(int(float(b['Points'])))
    
    for x in data:
        players.append(x['Player_Name'])
    
    def Average(lst):
        unrounded = sum(lst) / len(lst)
        return round(unrounded,2)
    
    result = Counter()
    for d in data:
        for b in d['Tournament']:
            result[d['Player_Name']] += int(float(b['Points'])) 
我该怎么做?

如果您的列表是l:

试试这个:

from itertools import groupby

result = [] 
for k,g in groupby(sorted(l, key=lambda x:x['Player_Name']), lambda x:x['Player_Name']): 
    result.append({'Player_Name':k, 'Tournament':[i['Tournament'][0] for i in g]}) 
那么结果将是:

[{'Player_Name': 'Byeong-Hun An',
  'Tournament': [
      {'Name': 'Arnold Palmer Invitational presented by Mastercard',
       'Points': '32.80',
       'Salary': '10300.00'},
      {'Name': 'Different',
       'Points': '18.80', 
       'Salary': '10400.00'}]}]
如果您的列表是l:

试试这个:

from itertools import groupby

result = [] 
for k,g in groupby(sorted(l, key=lambda x:x['Player_Name']), lambda x:x['Player_Name']): 
    result.append({'Player_Name':k, 'Tournament':[i['Tournament'][0] for i in g]}) 
那么结果将是:

[{'Player_Name': 'Byeong-Hun An',
  'Tournament': [
      {'Name': 'Arnold Palmer Invitational presented by Mastercard',
       'Points': '32.80',
       'Salary': '10300.00'},
      {'Name': 'Different',
       'Points': '18.80', 
       'Salary': '10400.00'}]}]

这也是一种更通用的解决方案,适用于任意键名:

from collections import defaultdict

d = defaultdict(list)

for dic in lst:
    for k, v in dic.items():
        if isinstance(v, list):
            d[k].extend(v)
        else:
            d[k] = v

answer = [dict(d)]

这也是一种更通用的解决方案,适用于任意键名:

from collections import defaultdict

d = defaultdict(list)

for dic in lst:
    for k, v in dic.items():
        if isinstance(v, list):
            d[k].extend(v)
        else:
            d[k] = v

answer = [dict(d)]

以下是我对解决方案的看法

创建新的词典列表 遍历字典的原始列表。 将每个播放器的开始数据的一个副本存储到新的字典列表中 将每个玩家的附加比赛数据添加到一个字典中,并添加到一个统一的比赛列表中。 下面以未经测试的代码为例,但应进行一些调整

listofDicts =   [{'Player_Name': 'Byeong-Hun An', 'Tournament': [{'Name': 'Arnold Palmer Invitational presented by Mastercard', 'Points': '32.80', 'Salary': '10300.00'}]},{'Player_Name': 'Byeong-Hun An', 'Tournament': [{'Name': 'Different', 'Points': '18.80', 'Salary': '10400.00'}]}]

newListOfDicts = []
playerName = " "
playerNo = -1
for dicts in listofDicts:
    if playerName == dicts['Player_Name']:
        newListOfDicts[playerNo]['Tournament'].append(dicts['Tournament'][0])
    else:
        newListOfDicts.append(dicts)
        playerName = dicts['Player_Name']
        playerNo += 1

以下是我对解决方案的看法

创建新的词典列表 遍历字典的原始列表。 将每个播放器的开始数据的一个副本存储到新的字典列表中 将每个玩家的附加比赛数据添加到一个字典中,并添加到一个统一的比赛列表中。 下面以未经测试的代码为例,但应进行一些调整

listofDicts =   [{'Player_Name': 'Byeong-Hun An', 'Tournament': [{'Name': 'Arnold Palmer Invitational presented by Mastercard', 'Points': '32.80', 'Salary': '10300.00'}]},{'Player_Name': 'Byeong-Hun An', 'Tournament': [{'Name': 'Different', 'Points': '18.80', 'Salary': '10400.00'}]}]

newListOfDicts = []
playerName = " "
playerNo = -1
for dicts in listofDicts:
    if playerName == dicts['Player_Name']:
        newListOfDicts[playerNo]['Tournament'].append(dicts['Tournament'][0])
    else:
        newListOfDicts.append(dicts)
        playerName = dicts['Player_Name']
        playerNo += 1

太棒了,这正是我需要的。我要结帐离开itertools@AustinJohnson你的来信,请你也考虑一下:他们都是adjacent@AustinJohnson我已经编辑了我的答案一段时间了,他们还没有调整。太棒了,这正是我需要的。我要结帐离开itertools@AustinJohnson你的来信,请你也考虑一下:他们都是adjacent@AustinJohnson我已经编辑了我的答案一段时间,但它们没有调整。