Home > database >  How to delete duplicates in dictionary with list values
How to delete duplicates in dictionary with list values

Time:07-09

I need to delete the elements that are duplicated in a dictionary like this:

{
    1: ['1', '2', '3'],
    2: ['4', '3', '6', '7'],
    3: ['8', '1', '9']
}

as to make the final result like this

{
    1: ['1', '2', '3'],
    2: ['4', '6', '7'],
    3: ['8', '9']
}

Please help me how to do that, I have no idea

CodePudding user response:

Assuming d the input, you can use a set to keep track of the seen values. Here using a dictionary comprehension and "cheating" a bit to add the values:

seen = set()
out = {k: [x for x in v
           if x not in seen and not seen.add(x)]
       for k,v in d.items()}

Output:

{1: ['1', '2', '3'],
 2: ['4', '6', '7'],
 3: ['8', '9']}

Same with a classical loop:

out = {}
seen = set()
for k,v in d.items():
    l = []
    for x in v:
        if x not in seen:
            seen.add(x)
            l.append(x)
    out[k] = l

CodePudding user response:

Rehashing the same old seen-set solution is boring :-P. Let's have some fun with Counters:

from collections import Counter

d = {
    1: ['1', '2', '3'],
    2: ['4', '3', '6', '7'],
    3: ['8', '1', '9']
}

seen = Counter()
for a in d.values():
    uniq = Counter(dict.fromkeys(a, 1))
    a[:] = uniq - seen
    seen |= uniq

print(d)

Each list is first deduplicated on its own by using a dict. Then turned into a Counter so we can conveniently subtract the previously seen values. Write the new ones into the list and add them to the seen ones.

Try it online!

CodePudding user response:

You could do the same with set union and difference operators. As sets are unordered the final list would need to be sorted. Again assuming d is the original dictionary.

s = set()
for k in d:
    z = d[k]
    d[k]= sorted(list(set(z).difference(s)))
    s |= set(z)
  • Related