我正在尝试创建一个字典对象,其中键是人们的名字,值是每个人的总分之和
这是称为得分的基本列表。如您所见,元列表的每个元素也是一个包含名称和分数元组的列表
[[('Sebastian Vettel', 25),
('Lewis Hamilton', 18),
('Kimi Raikkonen', 15),
('Daniel Ricciardo', 12),
('Fernando Alonso', 10),
('Max Verstappen', 8),
('Nico Hulkenberg', 6),
('Valtteri Bottas', 4),
('Stoffel Vandoorne', 2),
('Carlos Sainz', 1)],
[('Sebastian Vettel', 25),
('Valtteri Bottas', 18),
('Lewis Hamilton', 15),
('Pierre Gasly', 12),
('Kevin Magnussen', 10),
('Nico Hulkenberg', 8),
('Fernando Alonso', 6), ...
我想创建一个字典,其中包含唯一的名称作为键,并将所有分数的总和作为按分数总和排序(降序)的值。另外,我想将字典限制为总成绩前3名
到目前为止,这是我的尝试,但似乎缺少一些东西。
scores_total = defaultdict(int)
for (name,score) in scores:
key = name
values = score
scores_total[key] += int(score)
scores_total
但是我收到此错误:ValueError Traceback(最近一次调用最近) 在()中 1 scores_total = defaultdict(int) 2 3(分数,分数)的分数: 4键=名字 5个值=得分ValueError:太多值无法解包(预期2)
有什么办法解决这个问题吗?非常有用的帮助。
答案 0 :(得分:0)
首先创建一个字典,将所有分数的总和作为每个人的值,然后创建一个列表,该列表按现在为总和的值对键进行排序,反之则从大到小。然后仅将列表切成三个[:3]
并使用这些名称作为关键字创建字典以从旧字典中检索值。
d = {}
for i in scores:
for j in i:
if j[0] not in d:
d[j[0]] = j[1]
else:
d[j[0]] += j[1]
l = sorted(d, key=lambda x: d[x], reverse = True)
final = {i: d[i] for i in l[:3]}
print(final)
{'Sebastian Vettel': 50, 'Lewis Hamilton': 33, 'Valtteri Bottas': 22}
答案 1 :(得分:0)
您的解释让我有些迷惑,但这就是我的意思。
让我们说这是为了说足球比赛,而这些“分数”是为球员制定的目标,对吧?而且我还要假设单独的列表用于不同的游戏。
有了这个,您正在尝试以“整洁”的dict
形式对它们全部进行“概述”,对吗?如果是这样的话,您将有一个良好的开端。我会用:
from sortedcontainers import SortedList #this fixes your top 3 question
games = [
[('name', score), ('name', score)...], #game 1
[('name', score), ('name', score)] # game 2
]
scores_review = defaultdict(SortedList) #makes a sorted list as the dafault for the dict
for game in games:
for name, score in scores: #no need to wrap name, score in parentheses
scores_total[name].add(score)
现在scores_review
变量是一个dict,其中包含每个游戏的所有得分列表,并对其进行了排序。这意味着要为您刚刚使用的人获得前三名:
top_three = scores_review['name'][-3:]
要获得总和,只需使用:
all_scores = sum(scores_review['name'])