Python Forum
remove duplicates from dicts with list values
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
remove duplicates from dicts with list values
#15
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!
Reply


Messages In This Thread
RE: remove duplicates from dicts with list values - by DeaD_EyE - May-26-2024, 08:27 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  unable to remove all elements from list based on a condition sg_python 3 670 Jan-27-2024, 04:03 PM
Last Post: deanhystad
  Copying the order of another list with identical values gohanhango 7 1,429 Nov-29-2023, 09:17 PM
Last Post: Pedroski55
  Search Excel File with a list of values huzzug 4 1,462 Nov-03-2023, 05:35 PM
Last Post: huzzug
  Comparing List values to get indexes Edward_ 7 1,481 Jun-09-2023, 04:57 PM
Last Post: deanhystad
  Adding values with reduce() function from the list of tuples kinimod 10 3,071 Jan-24-2023, 08:22 AM
Last Post: perfringo
  user input values into list of lists tauros73 3 1,260 Dec-29-2022, 05:54 PM
Last Post: deanhystad
  remove partial duplicates from csv ledgreve 0 932 Dec-12-2022, 04:21 PM
Last Post: ledgreve
  Remove values for weekend in a panda series JaneTan 0 775 Dec-12-2022, 01:50 AM
Last Post: JaneTan
  Remove numbers from a list menator01 4 1,623 Nov-13-2022, 01:27 AM
Last Post: menator01
  Remove if similar values available based on two columns klllmmm 1 1,494 Feb-20-2022, 06:55 PM
Last Post: Larz60+

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020