Как объединить два словаря с одинаковыми именами ключей [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