对于学校我正在为游戏排名列表编写一个小程序。 我正在使用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答案 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 Eding的answer的一种变体,它单独比较每个值而不是创建值集。另外,它不需要任何导入。
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}