Python — сумма значений для дубликатов в dictonary

#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:

в словаре повторяющихся значений в качестве выходных данных выводится только последнее, не имеет значения, является ли оно самым большим или самым маленьким