保持重复键的最高值dict python 3

时间:2017-11-02 18:39:22

标签: python-3.x dictionary merge duplicates highest

对于学校我正在为游戏排名列表编写一个小程序。 我正在使用dicts,其中播放器的名称为keyname,分数为keyvalue。 将有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}

普通合并选项只需要第二个dict,然后是该值。

提前thnx

5 个答案:

答案 0 :(得分: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与其他词组进行比较等等。

答案 1 :(得分:1)

这是Matt Edinganswer的一种变体,它单独比较每个值而不是创建值集。另外,它不需要任何导入。

def combine_dicts(func, *dicts):
    d0 = {}
    for d in dicts:
        for k, v in d.items():
            if k not in d0:
                d0[k] = v
            else:
                d0[k] = func(v, d0[k])
    return d0

答案 2 :(得分:0)

你需要有一个能够跟踪每个玩家得分最高的功能。如果不存在,它会向总数添加一个玩家,否则如果它更高则添加它。 像这样:

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

答案 3 :(得分:0)

这是我对你的问题的一般解决方案。它是一个可以组合任意数量的字典的函数,如果你想要跟踪最小值,还可以选择其他比较函数。

import collections

def combine_dicts(func, *dicts):
    default = collections.defaultdict(set)
    for dict in dicts:
        for k, v in dict.items():
            default[k].add(v)
    return {k: func(v) for k, v in default.items()}

它使用 defaultdict 设置作为 default_factory ,以跟踪具有不同值的键的重复。然后它返回字典理解以过滤掉所需的值。

dict1 = {"a": 6, "b": 4, "c": 2, "g": 1}
dict2 = {"a": 3, "f": 4, "g": 5, "d": 2}
dict_comb = combine_dicts(max, dict1, dict2)
print(dict_comb)

输出:{&#39; a&#39;:6,&#39; b&#39;:4,&#39; c&#39;:2,&#39; g&#39;:5, &#39; f&#39;:4,&#39; d&#39;:2}

答案 4 :(得分: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}