#python #dictionary
#python #словарь
Вопрос:
У меня есть объект класса dict с тремя ключами следующим образом:
d={(1, 'B', 0):1.0,(0, 'A', 1): 3.0,(1, 'A', 1): 0.0, (2, 'A', 0): 0.0, (0, 'B', 0): 2.0}
Мне интересно, есть ли эффективный способ сгруппировать по этому dict по 2-му и 3-му элементам ключа и суммировать значения. Что-то вроде этого:
d_grouped = {('B', 0):3.0,('A', 1): 4.0,('A', 0): 0.0}
Комментарии:
1. кстати, у вас есть дубликаты ключей, которые перезаписывают друг друга
Ответ №1:
Используйте defaultdict и выполняйте итерации по d.items():
from collections import defaultdict
d = {(1, 'B', 0): 1.0,
(0, 'A', 1): 3.0,
(1, 'A', 1): 0.0,
(0, 'A', 1): 1.0,
(2, 'A', 0): 0.0,
(0, 'B', 0): 2.0
}
grouped = defaultdict(float)
for key, value in d.items():
grouped[key[1], key[2]] = value
print(grouped)
Вывод:
defaultdict(<class 'float'>, {('B', 0): 3.0, ('A', 1): 1.0, ('A', 0): 0.0})
Примечание: входной dict d
имеет дублированный ключ (0, 'A', 1)
Ответ №2:
def reduce_d(d):
new_d = {}
for k, v in d.items():
try:
k_new = (k[1:])
new_d[k_new] = v
except KeyError:
new_d[k_new] = v
return new_d
вывод:
{('B', 0): 3.0, ('A', 1): 1.0, ('A', 0): 0.0}
Ответ №3:
d_grouped = {}
for (_,x,y), v in d.items():
if (x,y) in d_grouped:
d_grouped[(x,y)] = v
else:
d_grouped[(x,y)] = v