группа словарей по подстроке ключа

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