2016-04-01 2 views
-2

У меня есть что-то вроде этого:Как добавить значения одних и тех же ключей в разных словарях в python?

A = {"Green":{"Small": 5, "Medium": 10, "Large": 15}, "Yellow": {"Small": 7, "Medium": 14, "Large": 21}} 

B = {"Green":{"Small": 1, "Medium": 2, "Large": 3}, "Yellow": {"Small": 3, "Medium": 6, "Large": 9}} 

Я хочу написать функцию, чтобы получить словарь «C», как это:

C = {"Green":{"Small": 6, "Medium": 12, "Large": 18}, "Yellow": {"Small": 10, "Medium": 20, "Large": 30}} 

Что только сумма каждого значения для его ключ (что во всех словарях одно и то же. В настоящее время мое «решение» слишком длинное и, конечно, не изящное. Может ли кто-нибудь дать мне несколько указаний на то, как я могу сделать относительно короткую функцию для достижения этого?

ответ

1

Функция, которая принимает произвольное количество словарей в виде OP описывает:

from pprint import pprint 

def dsum(*args): 
    return { 
     k1: { 
      k: sum(d.get(k1, dict()).get(k, 0) for d in args) 
      for k in set.union(*(set(d.get(k1, dict())) for d in args)) 
     } 
     for k1 in set.union(*(set(d) for d in args)) 
    } 

A = {"Green":{"Small": 5, "Medium": 10, "Large": 15}, "Yellow": {"Small": 7, "Medium": 14, "Large": 21}} 

B = {"Green":{"Small": 1, "Medium": 2, "Large": 3}, "Yellow": {"Small": 3, "Medium": 6, "Large": 9}} 

C = {"Green":{"Small": 6, "Medium": 12, "Large": 18}, "Yellow": {"Small": 10, "Medium": 20, "Large": 30}} 

testC = dsum(A, B) 
assert C == testC 
pprint(testC) 
+0

Возможно, вы захотите понять работу Big-O моего c ode, прежде чем указывать на большие наборы данных. –

+0

Я пытался понять код, хотя мне с ним сложно провести время. Он будет использоваться только для небольших наборов данных, поэтому сложность не должна быть проблемой для данного конкретного случая. Я немного экспериментирую с этим, пока не пойму это лучше. Благодаря! –

0
C={k: {kk: v + B[k][kk] for kk, v in a.items()} for k, a in A.items()} 

предпочитают .iteritems() в python2

2

Хорошие старые петли:

C = {} 
for k, v in A.items(): 
    inner = {} 
    for inner_k, inner_v in v.items(): 
     inner[inner_k] = inner_v + B[k][inner_k] 
    C[k] = inner 

>>> C 
{'Green': {'Large': 18, 'Medium': 12, 'Small': 6}, 
'Yellow': {'Large': 30, 'Medium': 20, 'Small': 10}} 
0

Раствор для отсутствующих ключей:

def merge_by_addition(d1, d2): 
    def m2(d1_, d2_): 
     keys_ = set(d1_.keys()) | set(d2_.keys()) 
     return {k_: (d1_.get(k_, 0) + d2_.get(k_, 0)) for k_ in keys_} 
    keys = set(d1.keys()) | set(d2.keys()) 
    return {k: m2(d1.get(k, {}), d2.get(k, {})) for k in keys} 
Смежные вопросы