2015-11-25 3 views
1

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

first = {"phone": { 
       "home": "(234) 442-4424" 
      }, 
     "address":"xyz" 
      } 


second = {"phone": { 
       "home": "(234) 442-4424", 
       "home1": "(234) 442-4424" 
      }, 
     "address":{} 
      } 

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

Окончательный словарь должен выглядеть следующим образом:

final = {"phone": { 
       "home": "(234) 442-4424", 
       "home1": "(234) 442-4424" 
      }, 
     "address":"xyz" 
      } 

И что, если, когда мы используем список словарей, как: -

first = {"phone": { 
       "home": "(234) 442-4424" 
      }, 
     "address":[{"home":""},{"office":""}] 
      } 

ответ

1

Update() будет работать, просто скопировать вторую Dict и применить первый.Таким образом, значение первого будет заменять второй, а не обратный путь.

first = {"phone": {"home": "(234) 442-4424"},"address":"xyz"} 
second = {"phone": {"home": "(234) 442-5555","home1": "(234) 442-4424"},"address":{}} 

# recursive deep update you can find here: http://stackoverflow.com/a/3233356/956660 
import collections 

def update(d, u): 
    for k, v in u.iteritems(): 
     if isinstance(v, collections.Mapping): 
      r = update(d.get(k, {}), v) 
      d[k] = r 
     else: 
      d[k] = u[k] 
    return d 

third = second.copy() 
update(third, first) 

print(third) 

{ 'телефон': { 'дом': '(234) 442-4424', 'home1': '(234) 442-4424'}, 'адрес': 'хуг'}

+0

отлично работает по мере необходимости. Позвольте мне понять логику, которую вы использовали. – user3048148

+0

Привет cyrbil, он работает нормально, но не получается, когда мы берем в нем список словарей. Я новичок в python, поэтому не могу понять, как это исправить. Я обновил билет. – user3048148

+0

Привет, пожалуйста, напишите еще один вопрос. Решение одной проблемы одновременно. – Cyrbil

4

ли second.update(first). Любые клавиши в обоих значениях будут иметь значение в first, и любые ключи, которые находятся в first, но не second, будут добавлены к second.

+0

Да, я использовал это, но я не хочу изменить первое ключевое значение. – user3048148

+0

@ user3048148: Если вы не хотите менять словарь, тогда выполните 'third = second.copy()', а затем 'third.update (first)'. –

0

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

first = {} 
second = {} 

for key in second.keys(): 
    if key not in first: 
    first[key] = second[key] 

Edit: Ваш комментарий "это не будет работать с многоуровневым словаря"

На самом деле, это will..technically говоря.

first = {"Person1" : {"Age": "26", "Name": "Person1", "Phone number": "XXXXXX"}} 
second = {"Person1": {"Interests": "fishing"}, "Person2": {"Age": "26", "Name": "Person2", "Phone number": "XXXXXX"}} 

В этом случае first ДИКТ получит Person2 объекта, но не изменит Person1 объекта, так как он уже есть!

+0

, но он не будет работать с многоуровневым словарем – user3048148

+0

@ user3048148, вы не указали, является ли ваш dict многоуровневым или нет. –

0

Предполагая, что ваши dictionnaries имеют следующую структуру:

  • каждый элемент является dictionnary
  • значения либо простые строки или dictionnaries

Если предположить, что требование:

  • если существует только ключ в одном из 2-х элементов для слияния, сохранить свое значение
  • если ключ существует в обеих элементах:
    • если значение в первом элементе является обычной строкой, сохранить свое значение
    • если значение в первом элемент представляет собой ДИКТ и значение в секунду является строкой, сохранить значение из первого
    • , если значения в обоих элементов ДИКТ объединить их с приоритетом к первому

Возможное совместное де затем:

for k, v in first.iteritems(): 
    if isinstance(v, str): 
     final[k] = v 
    elif k in final: 
     if isinstance(final[k], dict): 
      final[k].update(first[k]) 
     else: 
      final[k] = first[k] 
    else: 
     final[k] = first[k] 
Смежные вопросы