#python #python-3.x #dictionary #sum
Вопрос:
В Python3 у меня есть словарь {k = эпизод : значение = количество}, и я не могу понять, как группировать по подстрокам ключи, в которых суммируются значения.
вход:
dict = {'S01E01': 27, 'S01E02': 27, 'S01E03': 32, 'S01E04': 36, 'S01E05': 35, 'S01E06': 31,
'S02E01': 33, 'S02E02': 21, 'S02E03': 20, 'S02E04': 29, 'S02E05': 33, 'S02E06': 42}
Хотел выйти:
output_dict = {'S01': 188 , 'S02' : 178}
Я попытался составить промежуточный список сезонов и попытался использовать функции уменьшения и счетчика, но безуспешно.
List = ['S01', 'S02']
Также пытался найти здесь какие — либо результаты, но ничего не смог найти. Вероятно, неправильная терминология. Любая помощь будет признательна.
Спасибо
Ответ №1:
Ответ Onyambu, вероятно, является более питоническим способом решения этой проблемы, но если вы ищете более понятное для человека решение, которое подходит для данного конкретного случая использования, вы можете сделать что-то вроде этого:
episodes = {'S01E01': 27, 'S01E02': 27, 'S01E03': 32, 'S01E04': 36, 'S01E05': 35, 'S01E06': 31,
'S02E01': 33, 'S02E02': 21, 'S02E03': 20, 'S02E04': 29, 'S02E05': 33, 'S02E06': 42}
output = {}
for episode in episodes:
season = episode[0:3] #Gets the first 3 characters
if season not in output:
output[season] = episodes[episode]
else:
output[season] = episodes[episode]
print(output)
Комментарии:
1. Действительно, гораздо больше логики выражено в этих терминах. Спасибо
Ответ №2:
Используйте dict
понимание:
from itertools import groupby
{key:sum(list(zip(*val))[1]) for key, val in groupby(d.items(), key = lambda x:x[0][:3])}
Out: {'S01': 188, 'S02': 178}
Используя обычный цикл for, сначала сохраните свои данные как d
. тогда delete dict
, поскольку это внутренняя функция del dict
, т. е. Теперь вы можете запустить следующий код
result = dict()
for key, val in d.items():
var1 = key[:3]
if not result.get(var1):
result[var1] = 0
result[var1] = val
Комментарии:
1. Спасибо за объяснение, этого будет достаточно!
Ответ №3:
Я предполагаю, что подраздел состоит всего из 3 символов.
dic = {'S01E01': 27, 'S01E02': 27, 'S01E03': 32, 'S01E04': 36, 'S01E05': 35, 'S01E06': 31,
'S02E01': 33, 'S02E02': 21, 'S02E03': 20, 'S02E04': 29, 'S02E05': 33, 'S02E06': 42}
Сначала извлеките уникальные подразделы:
subkeys = set([key[:3] for key in dic.keys()])
Затем используйте понимание словаря, чтобы суммировать значения для каждого подраздела.
out = {subkey: sum([value for key, value in dic.items() if subkey in key]) for subkey in subkeys}
Более уродливый однострочный:
out = {subkey[:3]: sum([value for key, value in dic.items() if subkey[:3] in key]) for subkey in dic.keys()}
Ответ №4:
Другой подход:
data = {'S01E01': 27, 'S01E02': 27, 'S01E03': 32, 'S01E04': 36, 'S01E05': 35, 'S01E06': 31,
'S02E01': 33, 'S02E02': 21, 'S02E03': 20, 'S02E04': 29, 'S02E05': 33, 'S02E06': 42}
from itertools import groupby
out = {}
for key, value in groupby(data, lambda x:x[:3]):
out[key] = sum([data[val] for val in list(value)])
print (out)
Выход:
{'S01': 188, 'S02': 178}