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更新答案以获取所有玩家