Home > Enterprise >  Remove duplicate key, values from a dictionary such that each key or value appear only once
Remove duplicate key, values from a dictionary such that each key or value appear only once

Time:10-12

I have a python dictionary which contains multiple key,values which are actually image indexes. For e.g. the dictionary I have looks something as given below

{
    1: [1, 2, 3],
    2: [1, 2, 3],
    3: [1, 2, 3],
    4: [4, 5],
    5: [4, 5],
    6: [6]
}

this means that 1 is related to 1, 2 & 3. Similarly 2 is related to 1, 2 & 3. 6 has only 6 in it so it's related to none of the other elements. This is leading me to perform extra operations in my programs. I want the dictionary to be filtered and look like

# Preferred output
{
    1: [2, 3],
    4: [5],
    6: []
}

So far I have tried

new_dict = dict()

# source is the original dictionary
for k,v in source.items():
    ok = True
    for k1,v1 in new_dict.items():
        if k in v1: ok = False
    if ok: new_dict[k] = v

This modifies the dictionary to

{1: [1, 2, 3], 4: [4, 5], 6: [6]}

I am looking for a more efficient and pythonic way to solve this problem.

CodePudding user response:

How about this, use my modification below to remove the first item in the list during each loop. I commented the line which does it.

new_dict = dict()

# source is the original dictionary
for k,v in source.items():
    ok = True
    for k1,v1 in new_dict.items():
        if k in v1: ok = False
    if ok: new_dict[k] = v[1:] #this line removes the first element.

My output is,

{1: [2, 3], 4: [5], 6: []}

CodePudding user response:

This shows the preferred output:

source = {
    1: [1, 2, 3],
    2: [1, 2, 3],
    3: [1, 2, 3],
    4: [4, 5],
    5: [4, 5],
    6: [6]
}

new_dict = {}
seen = set()

for k, v in source.items():
    if k in seen: continue
    seen.add(k)
    new_v = [i for i in v if i not in seen]
    seen.update(new_v)
    
    new_dict[k] = new_v


print(new_dict)

CodePudding user response:

your modified code:

ver 1:

new_dict = dict()

for k, v in source.items():
    if not any(k in v1 for v1 in new_dict.values()):
        new_dict[k] = v[1:]

ver 2:

tmp = dict()
for k, v in source.items():
    tmp[tuple(v)] = tmp.get(tuple(v), [])   [k]

res = dict()
for k, v in tmp.items():
    res[v[0]] = v[1:]

ver 3:

new_dict = {v[0]: list(v[1:]) for v in set(map(tuple, source.values()))}
  • Related