#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
Надеюсь, это поможет вам, и прокомментируйте, если у вас возникнут дополнительные вопросы. : )