在字典中保留重复键的最高值

问题描述 投票:0回答:6

对于学校,我正在为游戏的排名编写一个小程序。 我为此使用字典,将玩家的名字作为键名,将得分作为键值。 将有 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}

正常的合并选项仅采用第二个字典,从而获取该值。

提前谢谢

python python-3.x dictionary merge duplicates
6个回答
2
投票

您需要有一个功能来跟踪每个玩家的最高分。如果玩家总数尚不存在,它会将其添加到总数中;如果总数更高,则将其添加到总数中。 像这样的东西:

def addScores(scores, total):
    for player in scores:
        if player not in total or total[player] < scores[player]:
            total[player] = scores[player]

2
投票

这就像一个魅力:

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
与其他词典进行比较等等。


2
投票

这是 Matt Edinganswer 的一个变体,它单独比较每个值,而不是创建一组值。作为一个优点,它不需要任何进口。

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}

1
投票

0000000111xcvjkxzvaskhaskdjfhsakjfhalsjfalksjfhaskjfhsakljfhas


0
投票

另一种方法,令人惊讶的是没有提出(因为 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}

0
投票

您可以考虑使用 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}
© www.soinside.com 2019 - 2024. All rights reserved.