#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).