Группируйте и объединяйте словарь с несколькими ключами в Python

#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