Oct-09-2019, 05:26 PM
For merging multiple dictionaries, proposed function dics_merge(), that alerts the user regarding presence of duplicate keys, affording option to permit overwriting or not, is placed below:
(a) Duplicate Keys List:
# Merge Dictionaries: da = {"a":5, "b":10, "c":15, "d":20, "e":25} db = {"f":55, "g":60, "h":65, "i":70, "j":75} dc = {"k":105, "b":110, "m":115, "d":120, "n":80} dd = {"p":155, "a":160, "b":165, "q":170, "r":180} de = {"k":100, "p":60, "j":70, "r":90} def dics_merge(diclist): dk = [] # List of duplicate keys owr = False # Overwrite Permission dmg1 = {**diclist[0]} # Merge Result - No Overwrite dmg2 = {**diclist[0]} # Merge Result - With Overwrite for d in diclist[1:]: dmg2 = {**dmg2, **d} for k, v in d.items(): if k in dmg1: dk.append(k) else: dmg1.setdefault(k, v) if len(dk) > 0: print("Duplicate Keys Detected: ", dk) ow = input("Shall Overwrite Existing Contents? Y/N ") if ow.lower() == "y": owr = True if owr == True: return dmg2 else: return dmg1 d_merge = dics_merge([da, db, dc, dd, de]) print(d_merge)Outputs are as follows:
(a) Duplicate Keys List:
Output:['b', 'd', 'a', 'b', 'k', 'p', 'j', 'r']
(b) Merge Result With No OverWrite:Output:{'a': 5, 'b': 10, 'c': 15, 'd': 20, 'e': 25, 'f': 55, 'g': 60, 'h': 65, 'i': 70, 'j': 75, 'k': 105, 'm': 115, 'n': 80, 'p': 155, 'q': 170, 'r': 180}
© Merge Result With OverWrite:Output:{'a': 160, 'b': 165, 'c': 15, 'd': 120, 'e': 25, 'f': 55, 'g': 60, 'h': 65, 'i': 70, 'j': 70, 'k': 100, 'm': 115, 'n': 80, 'p': 60, 'q': 170, 'r': 90}
Suggestions for further fine tuning of the proposed function would be most welcome.
A.D.Tejpal