2016-01-16 4 views
1

я пытаюсь построить функциюДобавление словарей

def adding_3dict(d1,d2,d3) 

Функция получает 3 словаря d1, d2, d3, создать из них один словарь D таким образом, что если ключ находится в более чем одной словарь из d1, d2, d3, его значение в D будет кортежем со всеми его значениями во всех словарях. Остальные пары из d1, d2, d3 копируются, как и в D. Функция возвращает новый словарь Д.

Пример:

d1={1:'a',3:'d',5:'e'} 
d2={1:'b',3:(11,22),7:'f',4:'q'} 
d3={2:'c',3:'x',4:'t',8:'g'} 

Словарь выход:

d = {1: ('a', 'b'), 2: 'c', 3: ('d', (11, 22), 'x'), 4: ('q', 't'), 5: 'e', 7: 'f', 8: 'g'} 

я попробовал:

import collections 

d1={} 
d2={} 
d3={} 
def adding_3dict(d1,d2,d3): 
    d={} 
    d=dict(d1.items() + d2.items()+ d3.items()) 

    return d 

я попробовал и мой выход это:

>>> 
>>> adding_3dict({1:'a',3:'d',5:'e'}, {1:'b',3:(11,22),7:'f',4:'q'} , {2:'c',3:'x',4:'t',8:'g'}) 
{1: 'b', 2: 'c', 3: 'x', 4: 't', 5: 'e', 7: 'f', 8: 'g'} #the output 
>>> 

как я могу изменить выход из

{1: 'b', 2: 'c', 3: 'x', 4: 't', 5: 'e', 7: 'f', 8: 'g'} 

в

{1: ('a', 'b'), 2: 'c', 3: ('d', (11, 22), 'x'), 4: ('q', 't'), 5: 'e', 7: 'f', 8: 'g'} 
+0

Нужны ли кортежи здесь? Не могли бы вы использовать списки? Кортежи неизменны и усложняют ситуацию. – amyrit

ответ

0

Вот решение, которое будет принимать произвольное число словарей:

from itertools import chain 

def custom_dictmerge(*args): 
    result = {} 
    keys = set(chain(*(d.keys() for d in args))) 
    for k in keys: 
     result[k] = tuple(d[k] for d in args if k in d) 
     if len(result[k]) == 1: 
      result[k] = result[k][0] 
    return result 

вызов custom_dictmerge(d1, d2, d3).

0

Использование defaultdict от collections позволяет добавлять все значения в список. Поэтому вам нужно только разобрать ключи каждого словаря.

from collections import defaultdict 

def mergedict(list_of_dicts): 
    d = defaultdict(list) 
    for di in list_of_dicts: 
     for k, v in di.items(): 
      d[k].append(v) 
    return d 

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

def convert_to_tuples(d): 
    """ converts values inplace """ 
    for k, v in d.items(): 
     if len(v) > 1: 
      d[k] = tuple(v) 
     else: 
      d[k] = v[0] 
    return d