Python 对字典进行分组和排序,并添加键值
我有一个字典列表,看起来像这样Python 对字典进行分组和排序,并添加键值,python,dictionary,group-by,Python,Dictionary,Group By,我有一个字典列表,看起来像这样 players = [{'Name': 'Player 1', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '9400'},{'Name': 'Player 2', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '8400'}, {'Name': 'Player 3', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '7400'}, {'Name': 'Player 2',
players = [{'Name': 'Player 1', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '9400'},{'Name': 'Player 2', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '8400'}, {'Name': 'Player 3', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '7400'}, {'Name': 'Player 2', 'Pos': 'RB', 'Team': 'NYG', 'Salary': '8400'}, {'Name': 'Player 3', 'Pos': 'RB', 'Team': 'NYG', 'Salary': '7400'}]
该词典列表将包含位置为QB、RB、WR、TE的玩家。我需要遍历列表,并按团队和职位对每个字典进行分组。然后我需要按工资降序排列每个职位。一旦我对每个dict进行了分组和排序,我需要在列表上进行迭代,并为播放器所在的位置添加一个深度键和一个值
例如:
最小RBs
[{'Name': 'Player 1', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '9400', 'Depth': 1,},{'Name': 'Player 2', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '8400', 'Depth': 2}, {'Name': 'Player 3', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '7400', 'Depth': 3}]
应该是最后的结果
我需要在每个位置都这样做——QB、RB、WR、TE。没有重复的球员,但球员可能有相同的工资,在这种情况下,深度将是相同的两名球员
这是我到目前为止所拥有的,但我不确定如何进一步细分
players = sorted(players, key=itemgetter('Pos'))
position_groups = dict((key, list(value)) for key, value in itertools.groupby(players,key=itemgetter('Pos')))
如果你对熊猫图书馆没有任何问题,它将是你问题的简单解决方案。 我没有得到与深度相关的最后一部分,但是第一部分的解决方案应该是这样的:
import pandas as pd
players = [{'Name': 'Player 1', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '9400'},
{'Name': 'Player 2', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '8400'},
{'Name': 'Player 3', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '7400'},
{'Name': 'Player 2', 'Pos': 'RB', 'Team': 'NYG', 'Salary': '8400'},
{'Name': 'Player 3', 'Pos': 'RB', 'Team': 'NYG', 'Salary': '7400'}]
df_players = pd.DataFrame(players)
df_RBs = df_players[df_players.Pos == 'RB']
print(df_RBs[df_RBs.Team == 'MIN'])
IIUC,您可以执行以下操作:
import pprint
from collections import defaultdict
from operator import itemgetter
players = [{'Name': 'Player 1', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '9400'},
{'Name': 'Player 2', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '8400'},
{'Name': 'Player 3', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '7400'},
{'Name': 'Player 2', 'Pos': 'RB', 'Team': 'NYG', 'Salary': '8400'},
{'Name': 'Player 3', 'Pos': 'RB', 'Team': 'NYG', 'Salary': '7400'}]
team_and_position = itemgetter('Team', 'Pos')
salary = itemgetter('Salary')
# create groups of positions within a given team
groups = defaultdict(list)
for player in players:
groups[team_and_position(player)].append(player)
# sort each group by salary in descending order
groups = {k: sorted(group, key=salary, reverse=True) for k, group in groups.items()}
# add depth value to each player
res = {k: [{**player, "Depth": depth} for depth, player in enumerate(group, 1)] for k, group in groups.items()}
# fetch MIN RB
vikings_rb = res[('MIN', 'RB')]
pprint.pprint(vikings_rb)
for group in groups.values():
for depth, player in enumerate(group, 1):
player['Depth'] = depth
输出
[{'Depth': 1, 'Name': 'Player 1', 'Pos': 'RB', 'Salary': '9400', 'Team': 'MIN'},
{'Depth': 2, 'Name': 'Player 2', 'Pos': 'RB', 'Salary': '8400', 'Team': 'MIN'},
{'Depth': 3, 'Name': 'Player 3', 'Pos': 'RB', 'Salary': '7400', 'Team': 'MIN'}]
[{'Depth': 1, 'Name': 'Player 1', 'Pos': 'RB', 'Salary': '9400', 'Team': 'MIN'},
{'Depth': 2, 'Name': 'Player 2', 'Pos': 'RB', 'Salary': '8400', 'Team': 'MIN'},
{'Depth': 3, 'Name': 'Player 3', 'Pos': 'RB', 'Salary': '7400', 'Team': 'MIN'},
{'Depth': 1, 'Name': 'Player 2', 'Pos': 'RB', 'Salary': '8400', 'Team': 'NYG'},
{'Depth': 2, 'Name': 'Player 3', 'Pos': 'RB', 'Salary': '7400', 'Team': 'NYG'}]
第一步是按团队和Pos对列表中的元素进行分组,为此您可以使用并提取键的值:
# create groups of positions within a given team
groups = defaultdict(list)
for player in players:
groups[team_and_position(player)].append(player)
第二步是按薪资降序对各组进行排序:
# sort each group by salary in descending order
groups = {k: sorted(group, key=salary, reverse=True) for k, group in groups.items()}
第二步可以就地完成,但我更喜欢字典理解。最后使用(从1开始)将深度值添加到每个字典:
# add depth value to each player
res = {k: [{**player, "Depth": depth} for depth, player in enumerate(group, 1)] for k, group in groups.items()}
# fetch ALL players
all_players = [player for group in res.values() for player in group]
pprint.pprint(all_players)
同样,可以在适当的位置执行此操作,执行以下操作:
import pprint
from collections import defaultdict
from operator import itemgetter
players = [{'Name': 'Player 1', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '9400'},
{'Name': 'Player 2', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '8400'},
{'Name': 'Player 3', 'Pos': 'RB', 'Team': 'MIN', 'Salary': '7400'},
{'Name': 'Player 2', 'Pos': 'RB', 'Team': 'NYG', 'Salary': '8400'},
{'Name': 'Player 3', 'Pos': 'RB', 'Team': 'NYG', 'Salary': '7400'}]
team_and_position = itemgetter('Team', 'Pos')
salary = itemgetter('Salary')
# create groups of positions within a given team
groups = defaultdict(list)
for player in players:
groups[team_and_position(player)].append(player)
# sort each group by salary in descending order
groups = {k: sorted(group, key=salary, reverse=True) for k, group in groups.items()}
# add depth value to each player
res = {k: [{**player, "Depth": depth} for depth, player in enumerate(group, 1)] for k, group in groups.items()}
# fetch MIN RB
vikings_rb = res[('MIN', 'RB')]
pprint.pprint(vikings_rb)
for group in groups.values():
for depth, player in enumerate(group, 1):
player['Depth'] = depth
更新
如果要获取所有玩家,只需展平字典的值:
# add depth value to each player
res = {k: [{**player, "Depth": depth} for depth, player in enumerate(group, 1)] for k, group in groups.items()}
# fetch ALL players
all_players = [player for group in res.values() for player in group]
pprint.pprint(all_players)
输出
[{'Depth': 1, 'Name': 'Player 1', 'Pos': 'RB', 'Salary': '9400', 'Team': 'MIN'},
{'Depth': 2, 'Name': 'Player 2', 'Pos': 'RB', 'Salary': '8400', 'Team': 'MIN'},
{'Depth': 3, 'Name': 'Player 3', 'Pos': 'RB', 'Salary': '7400', 'Team': 'MIN'}]
[{'Depth': 1, 'Name': 'Player 1', 'Pos': 'RB', 'Salary': '9400', 'Team': 'MIN'},
{'Depth': 2, 'Name': 'Player 2', 'Pos': 'RB', 'Salary': '8400', 'Team': 'MIN'},
{'Depth': 3, 'Name': 'Player 3', 'Pos': 'RB', 'Salary': '7400', 'Team': 'MIN'},
{'Depth': 1, 'Name': 'Player 2', 'Pos': 'RB', 'Salary': '8400', 'Team': 'NYG'},
{'Depth': 2, 'Name': 'Player 3', 'Pos': 'RB', 'Salary': '7400', 'Team': 'NYG'}]
在此之后,按照任何给定的标准对所有玩家列表进行排序。你被困在哪里了?你看了itertools吗?@Danimesjo我按位置对列表进行了分组,但我需要按teamsHow对这些列表进行分组。我可以像你有维京人一样返回每个玩家吗,但所有玩家=#原始列表中的所有玩家formatted@AustinJohnson有什么特别的顺序吗?是的,就像一张单子上写着player@AustinJohnson更新答案以获取所有玩家