2015-08-21 2 views
1

У меня есть два словаря со списками в качестве их значений.
Я хочу объединить их, сохраняя уникальный список в списках.
То, что я знаю:Объединить два словаря в питоне со списками как значения

d1 = {'a':['aa','bb']} 
d2 = {'a':['aa','cc'],'b':['xx','yy']} 
d1.update(d2) 
print d1 
>>> {'a': ['aa', 'cc'], 'b': ['xx', 'yy']} 

В то время как я хочу, чтобы получить

>>> {'a': ['aa', 'bb', 'cc'], 'b': ['xx', 'yy']} 

Что является наиболее эффективным способом достижения этой цели?

+9

Так, в сущности, ваши ценности должны быть * наборы *, а не списки, так как вы только сохранить уникальные элементы. –

+0

делает заказ вопрос? –

+0

Padraic Cunningham no it is not – user3399516

ответ

4

Использование наборов вместо списков:

{k: set(d1.get(k, [])) | set(d2.get(k, [])) for k in d1.viewkeys() | d2} 

Для вашего ввода образца это производит:

>>> d1 = {'a':['aa','bb']} 
>>> d2 = {'a':['aa','cc'],'b':['xx','yy']} 
>>> {k: set(d1.get(k, [])) | set(d2.get(k, [])) for k in d1.viewkeys() | d2} 
{'a': set(['aa', 'cc', 'bb']), 'b': set(['yy', 'xx'])} 

Это было бы проще, если бы вы изменили свои входные словари использовать наборы для значений тоже.

Если вы должны иметь списки и порядок не имеет значения, конвертировать наборы обратно в списках:

{k: list(set(d1.get(k, [])) | set(d2.get(k, []))) for k in d1.viewkeys() | d2} 
+0

Есть ли какая-нибудь точка в вызове '.viewkeys()' во втором dict? –

+2

@PadraicCunningham: нет; удален. –

+0

@MartijnPieters спасибо. Если я использую наборы для входных словарей, таких как d1 = {'a': set (['aa', 'bb'])}, как он будет работать тогда? – user3399516

Смежные вопросы