2015-03-06 17 views
0

У меня есть два словаря, которые я хочу сопоставить по ключу, чтобы создать новый словарь с каждым значением в dict1 как ключ и список значений каждого соответствующего ключа в dict2 как значение на выходе. Пример должен быть менее запутанным:Сопоставьте два словаря по ключам и возвращаемому массиву значений

dict1 = {'AAA': 'id5', 'BBB': 'id3', 'CCC': 'id8', 'DDD': 'id3'} 
dict2 = {'AAA': 'value8', 'BBB': 'value24', 'CCC': 'value13', 'DDD': 'value2'} 

То, что я пробовал:

keys = set(dict1) & set(dict2) 
complete = {} 
for x in keys: 
    key = dict1[x] 
    value = dict2[x] 
    complete[key] = [value] 

Выход:

complete = {'id3': ['value24'], 'id5': ['value8'], 'id8': ['value13']} 

Желаемый результат:

complete = {'id3': ['value24', 'value2'], 'id5': ['value8'], 'id8': ['value13']} 

В действительности словари довольно большой, поэтому pe Важным фактором является реформация. Любая помощь приветствуется.

+0

Почему '' id3'' используется, поскольку он не уникален? –

+0

@PadraicCunningham: вот в чем смысл; Я тоже неправильно понял, но * значения * из 'dict1' являются * ключами * на выходе, в сочетании со значениями из другого словаря. –

+0

@MartijnPieters. yep, но 'id3' появляется дважды, поэтому ключи должны быть' id5' и 'id8', идущими *. Создайте новый словарь с каждым уникальным значением в dict1 как ключ * –

ответ

2

dict.keys() method возвращает dictionary view, который уже действует как комплект. Все, что вам нужно сделать, это объединить эти взгляды.

Если значения из dict1 не являются уникальными, используйте dict.setdefault() для создания списков значений:

output = {} 
for key in dict1.keys() & dict2.keys(): 
    output.setdefault(dict1[key], []).append(dict2[key]) 

Demo:

>>> dict1 = {'AAA': 'id5', 'BBB': 'id3', 'CCC': 'id8', 'DDD': 'id3'} 
>>> dict2 = {'AAA': 'value8', 'BBB': 'value24', 'CCC': 'value13', 'DDD': 'value2'} 
>>> output = {} 
>>> for key in dict1.keys() & dict2.keys(): 
...  output.setdefault(dict1[key], []).append(dict2[key]) 
... 
>>> output 
{'id8': ['value13'], 'id3': ['value24', 'value2'], 'id5': ['value8']} 

Это примерно так же эффективно, как он будет получать.