2017-01-17 2 views
0

У меня есть два dictionarysКак я могу объединить и суммировать два словарных ключа и элементов?

dict1 = { 
"list": { 
    "alpha": { 
     "a": { 
      "score": 1, 
      "visit": 2 
     }, 
     "b": { 
      "score": 3, 
      "visit": 4 
     } 
    }, 
    "beta" : { 
     "a": { 
      "score": 1, 
      "visit": 2 
     }, 
     "b": { 
      "score": 3, 
      "visit": 4 
     } 
    } 
} 
} 

dict2 = { 
"list": { 
    "alpha": { 
     "a": { 
      "score": 1, 
      "visit": 2 
     }, 
     "c": { 
      "score": 5, 
      "visit": 6 
     } 
    }, 
    "beta" : { 
     "a": { 
      "score": 1, 
      "visit": 2 
     }, 
     "c": { 
      "score": 5, 
      "visit": 6 
     } 
    } 
} 
} 

Я хочу объединить словарь как этого

dict1 = { 
"list": { 
    "alpha": { 
     "a" : { 
      "score": 2, 
      "visit": 4 
     }, 
     "b": { 
      "score": 3, 
      "visit": 4 
     }, 
     "c": { 
      "score": 5, 
      "visit": 6 
     } 
    }, 
    "beta": { 
     "a": { 
      "score": 2, 
      "visit": 4 
     }, 
     "b": { 
      "score": 3, 
      "visit": 4 
     }, 
     "c": { 
      "score": 5, 
      "visit": 6 
     } 
    } 
} 
} 

Условия 1. значение всегда новый словарь или Int (не НТР)

Условия 2. Если тот же ключ существует на одной и той же глубине, значение этого ключа должно быть суммой.


Возможно, я могу решить эту проблему, используя для петель. Но Python, кажется, имеет более простой и быстрый способ.

это мой лучший.

код:

def logic(d1, d2, inconflict = lambda v1,v2 : v1+v2) : 
    for k in d2: 
     if k in d1 : 
      if isinstance(d1[k], dict) and isinstance(d2[k], dict) : 
       logic(d1[k], d2[k], inconflict) 

      elif isinstance(d1[k], int) : 
       d1[k] = inconflict(d1[k], d2[k]) 
     else : 
      d1[k] = d2[k] 
    return d1 

print logic(dict1, dict2) 

ответ

1

Это рекурсивная структура данных; давайте использовать рекурсию.

Редактировать: пропустил тег python-2.6, там не было никаких понятий. Edit2: Скопируйте значения, если они существуют только в одном из них, иначе вы столкнетесь с сюрпризами, ссылаясь на тот же словарь, что и внутри двух отдельных словарей.

import copy 

def recursively_sum(var1, var2): 
    """If var1 and var2 are ints, return their sum. Otherwise they are dicts 
    and we recursively sum for each key that is either in var1 or var2.""" 

    if var1 is None: 
     return copy.deepcopy(var2) 
    elif var2 is None: 
     return copy.deepcopy(var1) 
    elif isinstance(var1, int): 
     return var1 + var2 
    else: 
     result = {} 
     for key in set(var1) | set(var2): 
      result[key] = recursively_sum(var1.get(key), var2.get(key)) 
     return result 
+0

спасибо. Я многому научился. – nontoxice