#python #python-3.x
#python #python-3.x
Вопрос:
У меня есть текстовый файл, который выглядит следующим образом, он содержит имя фамилию и оценку для каждого человека.
Martin Johansson 1
Maria Smith 3
James Anderson 0
Karl Miller 2
Robert Wilson 1
Maria Smith 2
Maria Smith 1
Я сопоставил имена и оценку в dict, как я могу суммировать оценку по ex. Мария Смит, которая является дубликатом.
Цель состоит в том, чтобы код распечатал человека с наибольшим количеством баллов, в данном случае это будет Мария Смит.
Мой код
import collections
names = []
points = []
totalScore = 0
with open("score3.txt", "r") as f:
for line in f:
splitLine = line.split(" ")
names.append(splitLine[2] " " splitLine[3])
points.append(int(splitLine[4]))
# Maps my names and points together
content_list = dict(zip(names, points))
# Check for duplicates
duplicates = [item for item, count in collections.Counter(names).items() if count > 1]
Итак, что-то вроде этого
if duplicates == True:
totalScore = sum(item[points] for item in content_list)
print(totalScore)
заранее спасибо
Ответ №1:
Когда вы создаете свой словарь, вы теряете дублирующуюся информацию — сохраняется только последняя из каждой кратности.
Решение, которое вы ищете, состоит в том, чтобы выполнять агрегированные суммы заранее или непосредственно при создании словаря:
content_list = {}
for (name, score) in zip(names,points):
if name in content_list.keys():
#if the value is already in list, add current score to the sum
content_list[name] = score
else:
#if the value is not yet in list, create an entry
content_list[name] = score
Более быстрым способом сделать это было бы подготовить список имен, чтобы убедиться, что в словаре есть все ключи, а затем выполнить агрегацию. Но если вы не остро нуждаетесь в быстром решении, это довольно простое.(и даже не так медленно)
Комментарии:
1. Просто для добавления,
content_list = defaultdict(int)
также может использоваться для уменьшения общего количества строк.
Ответ №2:
Вы также можете попробовать это.
content_dict = {}
for name, score in zip(names,points):
value = content_dict.setdefault(name, 0)
content_dict[name] = value score
Комментарии:
1. Также может быть просто
content_dict[name] = content_dict.get(name, 0) score
2. Спасибо! Сработало отлично.
Ответ №3:
в словаре повторяющихся значений в качестве выходных данных выводится только последнее, не имеет значения, является ли оно самым большим или самым маленьким