May-26-2024, 08:27 PM
My try...
dict1 = { "SAG01112_SSAP_HA_LPM": [["OS_TYPE", "AIX"], ["IS_COBOL", "1"]], "SAP": [], "C11_RG": [], "W11_RG": [], } dict2 = { "SAG01112_SSAP_HA_LPM": [ ["OS_TYPE", "AIX"], ["IP", "172.17.10.112"], ["IP", "10.111.160.119"], ["IP", "10.111.160.68"], ["IP", "10.111.160.66"], ["IP", "10.95.0.112"], ["IP", "10.111.162.119"], ], "SAP": [], "C11_RG": [], "W11_RG": [], } from itertools import chain def deduplicate(*dicts): """ Generator: Deduplicate all iterable values for each key for each dict. The order is kept by the occourence of keys in the first dict, second dict, ... """ all_keys = [] # iterate over *dicts and append them only, if they don't exist # this keeps the key-order of the first dict, second dict, ... for key in chain.from_iterable(dicts): if key not in all_keys: all_keys.append(key) print("all_keys:", all_keys) # iterate over all keys for key in all_keys: # list of results, this will later yielded result = [] # iterate over dicts for input_dict in dicts: # for each dict, call get(key, []) which reuturns an emtpy list # if the key does not exist, otherwise the value is returned for value in input_dict.get(key, []): if value in result: print("Duplicate:", value) # skipping the value if it's already in result continue # append, if the value is not in result result.append(value) yield key, result # you could also use result.clear(), # but then you have to yield a copy with result.copy() # here a new list is assigned, and no copy does happen result = [] def deduplicate2dict(*dicts): """ Wrapper function to return a dict """ return dict(deduplicate(*dicts)) result1 = dict(deduplicate(dict1, dict2)) result2 = deduplicate2dict(dict1, dict2)
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
All humans together. We don't need politicians!