Я наткнулся на сообщение, в котором был полный и правильный способ объединения двух словарей, когда каждый словарь имеет для каждого ключа список значений.
Ввод программы выглядит примерно так:
d1: {'apple': ['5', '65'], 'blue': ['9', '10', '15', '43'], 'candle': ['15'], 'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'], 'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '23', '24', '25', '29', '45']}
d2: {'apple': ['43', '47'], 'appricote': ['1', '2', '3', '4', '5', '6'], 'candle': ['1', '2', '4', '5', '6', '9'], 'delta': ['14', '43', '47'], 'dragon': ['23', '24', '25', '26'], 'eclipse': ['11', '13', '15', '19'], 'island': ['1', '34', '35']}
код функции слияния:
def merge_dictionaries(dict1, dict2):
result = {}
new_result = {}
for key in set().union(*(dict1, dict2)):
result[key] = sorted(dict1.get(key, []) + dict2.get(key, []), key=int)
# Delete any double value for each key
new_result[key] = [ii for n, ii in enumerate(result[key]) if ii not in result[key][:n]]
return new_result
С результатом:
Merged: {'is': ['5', '6', '13', '45', '96'], 'dragon': ['23', '24', '25', '26'], 'apple': ['5', '43', '47', '65'], 'appricote': ['1', '2', '3', '4', '5', '6'], 'delta': ['14', '43', '47'], 'eclipse': ['11', '13', '15', '19'], 'yes': ['1', '2', '3', '11'], 'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '23', '24', '25', '29', '45'], 'blue': ['9', '10', '15', '43'], 'island': ['1', '34', '35'], 'candle': ['1', '2', '4', '5', '6', '9', '15']}
То, чего я хочу достичь сейчас, - это расширить этот путь для объединения динамического числа словарей такого рода. Это моя попытка, в которой я каждый раз получаю из списка «диктов» 2 элемента и пытаюсь объединить их.
def merge_multiple_dictionaries(dicts):
''' This is just to print the input I get
l = len(dicts)
print("Len of dicts: ", l)
for j in range(0, l):
print("j is: ", dicts[j])
'''
result = {}
new_result = {}
for k in range(0, l):
if k is (len(dicts)-1):
break
print("k: ", k)
for key in set().union(*(dicts[k], dicts[k+1])):
result[key] = sorted(dicts[k].get(key, []) + dicts[k+1].get(key, []), key=int)
# Delete any double value for each key
new_result[key] = [ii for n, ii in enumerate(result[key]) if ii not in result[key][:n]]
# result = OrderedDict(sorted([(k, v) for k, v in result.items()]))
return new_result
Так есть ли более питонный способ достичь этого?