具有键和值的字典理解

时间:2018-10-02 21:56:07

标签: python dictionary

我正在尝试创建一个字典对象,其中键是人们的名字,值是每个人的总分之和

  

这是称为得分的基本列表。如您所见,元列表的每个元素也是一个包含名称和分数元组的列表

[[('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)

有什么办法解决这个问题吗?非常有用的帮助。

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'])