Понимание словаря с ключами и значениями - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь создать объект словаря, ключами которого являются имена людей, а значениями - сумма всех баллов каждого человека

Вот базовый список, называемый баллами.Как видите, каждый элемент мета-списка также является списком, содержащим кортежи имен и оценок

[[('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 голосов
/ 03 октября 2018

Я немного растерялся из-за твоего объяснения, но вот что я получаю.

Скажем, это было, скажем, для футбольных игр, а эти "результаты" предназначены для поставленных голов игроков, верно?И я также собираюсь предположить, что использование отдельных списков предназначено для разных игр.

При этом вы пытаетесь получить «обзор» их всех в один «аккуратный» 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 - это диктат со списками всех их очков для каждой игры, и она отсортирована.Это означает получить топ-3 для того, кого вы просто используете:

top_three = scores_review['name'][-3:]

А для получения суммы просто используйте:

all_scores = sum(scores_review['name'])
0 голосов
/ 03 октября 2018

сначала создайте словарь, в котором все значения суммируются как значения для каждого человека, а затем составьте список, который сортирует ключи по значению, которое теперь является суммой, в обратном порядке, чтобы получить наибольшее или меньшее значение.Затем разделите этот список только на три [: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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...