Объединить 2 вложенных значения словаря в один Python

#python #python-3.x #python-2.7

#python #python-3.x #python-2.7

Вопрос:

У меня есть следующие 2 dict, я хотел бы объединить обновление dict1 со значениями dict2 , подобными приведенным ниже. добавляет новые ключи, если они не существуют, и обновляет значения.

dict1

 {'https://site1.com': 
{'React': None, 'Drupal': '5.1','python':None}}
  

dict2

 {'https://site1.com':
{'React': '6.0', 'Drupal': '5.3','PHP':'7'},
'https://site2.com':{'Rails':'6.1'}}
  

к следующему выводу:

final_dict

 {'https://site1.com': 
{'React': '6.0', 'Drupal': '5.3','PHP':'7','python':None},
'https://site2.com':{'Rails':'6.1'}}
  

Комментарии:

1. Не дубликат

2. Действительно, это не дубликат, моя ошибка. Не заметил, что у dicts есть разные подразделы.

Ответ №1:

Вы можете перебирать элементы dict2 и обновлять dict1 значениями одних и тех же ключей. Используйте dict.setdefault метод для инициализации новых ключей с помощью dict:

 for k, v in dict2.items():
    dict1.setdefault(k, {}).update(v)
  

С вашим примером ввода dict1 стало бы:

 {'https://site1.com': {'React': '6.0', 'Drupal': '5.3', 'python': None, 'PHP': '7'}, 'https://site2.com': {'Rails': '6.1'}}
  

Ответ №2:

 final_dict = {**dict1, **dict2}
  

(это для Python 3.5 )

Комментарии:

1. Это не привело бы к объединению подразделов.

2. @blhsing Я думаю, вы правы, по-видимому, это просто переопределяет подразделы.

Ответ №3:

final_dict = dict1.update(dict2) Не работает? Ресурс

Редактировать: вау, на самом деле это не так. Ответ Луки правильный.

Ответ №4:

Перебираем ключи в двух dict, если оба имеют значение, выбираем больший (в моем понимании), поддерживаем подраздел dict, комбинируя их рекурсивно:

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

 def combine_dict(dict1, dict2):
    final_dict = {}
    # iterate keys in two dict
    for k in dict1.keys() | dict2.keys():
        v1 = dict1.get(k, None)
        v2 = dict2.get(k, None)
        if isinstance(v1, dict) or isinstance(v2, dict):
            if not v1: v1 = {}
            if not v2: v2 = {}
            # combine recursively
            final_dict[k] = combine_dict(v1, v2)
        else:
            final_dict[k] = v2
            # if v1 and v2:
            #     final_dict[k] = max(v1, v2)
            # else:
            #     final_dict[k] = v1 or v2
    return final_dict

def test():
    dict1 = {'https://site1.com': {'React': None, 'Drupal': '5.1', 'python': None}}
    dict2 = {'https://site1.com': {'React': '6.0', 'Drupal': '5.3', 'PHP': '7'}, 'https://site2.com': {'Rails': '6.1'}}
    final_dict = {'https://site1.com': {'React': '6.0', 'Drupal': '5.3', 'PHP': '7', 'python': None},
                  'https://site2.com': {'Rails': '6.1'}}
    print(final_dict == combine_dict(dict1, dict2))     # output true
  

Надеюсь, это поможет вам, и прокомментируйте, если у вас возникнут дополнительные вопросы. : )