对于学校,我正在为游戏的排名编写一个小程序。 我为此使用字典,将玩家的名字作为键名,将得分作为键值。 将有 10 场比赛,每场比赛都有一个自动排名系统,我将其打印到文件中。 我已经成功编写了排名系统的代码,但现在我面临着一个我无法解决的更大挑战:
我必须做一个总体排名,这意味着某个玩家的名字可以参加多次比赛并获得多个分数,但我只需要保留重复的最高分。
简而言之:我需要一些帮助来保持重复键具有最高值:
像这样:
dict1 = {"a": 6, "b": 4, "c": 2, "g": 1}
dict2 = {"a": 3, "f": 4, "g": 5, "d": 2}
dictcombined = {'a': 6, 'b': 4, 'c': 2, 'g': 5, 'f': 4, 'd': 2}
正常的合并选项仅采用第二个字典,从而获取该值。
提前谢谢
您需要有一个功能来跟踪每个玩家的最高分。如果玩家总数尚不存在,它会将其添加到总数中;如果总数更高,则将其添加到总数中。 像这样的东西:
def addScores(scores, total):
for player in scores:
if player not in total or total[player] < scores[player]:
total[player] = scores[player]
这就像一个魅力:
dict1 = {"a": 6, "z": 4, "g": 1, "hh": 50, "ggg": 1}
dict2 = {"a": 3, "g": 5, "d": 2, "hh": 50}
for key in dict1:
if key not in dict2 or dict1[key] > dict2[key]:
dict2[key] = dict1[key]
print (dict1)
print (dict2)
dict3 = {**dict1, **dict2}
print (dict3)
现在我可以将
dict3
与其他词典进行比较等等。
这是 Matt Eding 的 answer 的一个变体,它单独比较每个值,而不是创建一组值。作为一个优点,它不需要任何进口。
def combine_dicts(chooser, *dicts):
combined = {}
for d in dicts:
for k, v in d.items():
if k not in combined:
combined[k] = v
else:
combined[k] = chooser(v, combined[k])
return combined
用途:
>>> combine_dicts(max, dict1, dict2)
{'a': 6, 'b': 4, 'c': 2, 'g': 5, 'f': 4, 'd': 2}
0000000111xcvjkxzvaskhaskdjfhsakjfhalsjfalksjfhaskjfhsakljfhas
另一种方法,令人惊讶的是没有提出(因为 100% 内置)
>>> dict(sorted([*dict1.items(), *dict2.items()]))
{'a': 6, 'b': 4, 'c': 2, 'd': 2, 'f': 4, 'g': 5}
如果您的键值对不太“字典式”,您可能需要专门针对数字,这样做
>>> dict(sorted([*dict1.items(), *dict2.items()], key=lambda item: item[1]))
{'g': 5, 'c': 2, 'd': 2, 'a': 6, 'b': 4, 'f': 4}
您可以考虑使用 Pandas 来实现此目的。它还具有大量其他有用的数据处理功能。
可能有一个理想的方法来解决这个问题,但我想到的第一件事是创建两个系列(有点像字典),将它们连接起来,按标签(a,b,c等)分组,然后获取每组的最大值。
import pandas as pd
s1, s2 = [pd.Series(d, name='Scores') for d in [dict1, dict2]]
result = pd.concat([s1, s2]).groupby(level=0).max()
>>> result
a 6
b 4
c 2
d 2
f 4
g 5
Name: Scores, dtype: int64
如果你想要结果作为字典:
>>> result.to_dict()
{'a': 6, 'b': 4, 'c': 2, 'd': 2, 'f': 4, 'g': 5}