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我已经编辑了我的答案一段时间,但它们没有调整。