Сумма значений в словаре

#python #list #dictionary #sum

#python #Список #словарь #сумма

Вопрос:

Я работаю с файлом Excel и openpyxl.

Ниже приведены примеры данных:

 Name    Value
Amy1    4
Bob1    5
Bob1    5
Bob2    8
Chris1  7
Chris2  3
Chris3  6
Chris3  6
Chris3  6
  

Используя приведенный ниже цикл for, я извлекаю значение, связанное с каждым уникальным именем.

 for rowNum in range(2, 11):
    person = sheet.cell(row = rowNum, column = 13).value
    people.append(person)
    personValue.update({person: sheet.cell(row = rowNum, column = 26).value})
  

Это дает словарь с одной записью для каждого имени (Amy1, Bob1, Bob2 и т.д.).

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

 Name  Value
Amy   4
Bob   13
Chris 16
  

Комментарии:

1. Используйте defaultdict

Ответ №1:

Вы можете использовать get() метод, чтобы установить значение по умолчанию для ключа, а затем добавить к нему таким образом.

Поскольку все ваши ключи находятся в формате name #, вы можете получить желаемый конечный результат следующим образом:

 mergedResult = dict()

for name in startingDict:
    mergedResult[name[:-1]] = mergedResult.get(name[:-1], 0)   startingDict[name]
  

Здесь get() метод проверяет наличие ключа name[:-1] (имя из вашего начального словаря без конечного символа) в вашем результирующем словаре. Если этот ключ отсутствует, он добавляет его со значением по умолчанию 0 и возвращает это значение. Если этот ключ уже присутствует, он просто возвращает соответствующее значение. Затем значение из вашего начального словаря добавляется к значению в вашем результирующем словаре.

Ответ №2:

Если name = sheet.cell(row = rowNum, column = 13).value

И value = sheet.cell(row = rowNum, column = 26).value

Отредактировано в соответствии с вашими комментариями:

 from collections import defaultdict

people = defaultdict(int)
category = defaultdict(int)

for rowNum in range(2, 11):
    # Name with number
    person = sheet.cell(row = rowNum, column = 13).value
    # Name without number
    category_name = ''.join([c for c in person if not c.isdigit()])
    people[person]  = sheet.cell(row = rowNum, column = 26).value
    category[category_name]  = sheet.cell(row = rowNum, column = 26).value
  

Результат — люди:

 Name    Value
Amy1    4
Bob1    10
Bob2    8
Chris1  7
Chris2  3
Chris3  18
  

Результат — категория:

 Name    Value
Amy     4
Bob     18
Chris   28
  

Это сработает.

Спасибо Падрайку Каннингему. Я только что понял, что я неправильно понял.

Комментарии:

1. Вы полностью упускаете из виду весь смысл использования defaultdict

2. Это суммирует все значения и приводит к значению имени Amy 4 Bob 18 Chris 28

3. (Упс, хотел добавить больше к этому комментарию).

4. Мне нужно, чтобы он измерял каждое значение (Amy1, Bob1, Bob2) только один раз, а затем суммировал значения каждого из них в одну категорию (Bob1 Bob2 Bob3 = 13).