Как объединить два словаря с одинаковыми именами ключей [duplicate]
этот вопрос уже есть ответ здесь:
Я новичок в Python и пытаюсь написать функцию, которая объединит два объекта словаря в python. Например,
dict1 = {'a':[1], 'b':[2]}
dict2 = {'b':[3], 'c':[4]}
мне нужно создать новый объединенный словарь
dict3 = {'a':[1], 'b':[2,3], 'c':[4]}
функция также должна принимать параметр "конфликт" (значение True или False). Когда конфликт установлен в False, выше нормально. Когда conflict имеет значение True, код объединит словарь следующим образом:
dict3 = {'a':[1], 'b_1':[2], 'b_2':[3], 'c':[4]}
Я пытаюсь добавить 2 словаря, но не уверен, как это сделать правильно.
for key in dict1.keys():
if dict2.has_key(key):
dict2[key].append(dict1[key])
2 ответов
Если вы хотите объединенную копию, которая не изменяет исходные дикты и следит за конфликтами имен, вы можете попробовать это решение:
>>> dict1 = {'a': [1], 'b': [2]}
>>> dict2 = {'b': [3], 'c': [4]}
>>> import copy
>>> import itertools
>>> def merge(a, b, conflict):
new = copy.deepcopy(a)
if conflict:
for key, value in b.items():
if key in new:
counter = itertools.count(1)
# Rename 1st key.
while True:
name = '{}_{}'.format(key, next(counter))
if name not in new:
new[name] = new[key]
del new[key]
break
# Create 2nd key.
while True:
name = '{}_{}'.format(key, next(counter))
if name not in new:
new[name] = value
break
else:
new[key] = value
else:
for key, value in b.items():
new.setdefault(key, []).extend(value)
return new
>>> merge(dict1, dict2, False)
{'c': [4], 'b': [2, 3], 'a': [1]}
>>> merge(dict1, dict2, True)
{'b_2': [3], 'b_1': [2], 'c': [4], 'a': [1]}
Я думаю, вы хотите этого:
dict1 = {'a':[1], 'b':[2]}
dict2 = {'b':[3], 'c':[4]}
def mergeArray(conflict):
for key in dict1.keys():
if dict2.has_key(key):
if conflict==False:
dict2[key].extend(dict1[key])
else:
dict2[key+'_1'] = dict1[key]
dict2[key+'_2'] = dict2.pop(key)
else:
dict2[key] = dict1[key]
mergeArray(True);
print dict2