Ariel M
Ariel M

Reputation: 205

Python remove keys with the same value on a dictionary

I need to do a not "natural" operation on a dictionary so i wondering what is the best pythonic way to do this.

I need to simplify a dictionary by removing all the keys on it with the same value (keys are differents, values are the same)

For example: Input:

  dict = {key1 : [1,2,3], key2: [1,2,6], key3: [1,2,3]}

expected output:

  {key1 : [1,2,3], key2:[1,2,6]}

I dont care about which key is delete (on the example: key1 or key3)

Upvotes: 4

Views: 6836

Answers (5)

pippo1980
pippo1980

Reputation: 3041

this worked for me:

seen = set()
for key in mydict.copy():
    value = tuple(mydict[key])
    if value in seen:
        del mydict[key]
    else:
        seen.add(value) 

Upvotes: 0

Padraic Cunningham
Padraic Cunningham

Reputation: 180391

You can iterate over your dict items and use a set to check what we have seen so far, deleting a key if we have already seen the value:

d = {"key1" : [1,2,3], "key2": [1,2,6], "key3": [1,2,3]}
seen = set()
for k, v in d.items(): # list(items) for python3
    temp = tuple(v) 
    if temp in seen:
        del d[k]
    seen.add(temp)
print(d)
{'key1': [1, 2, 3], 'key2': [1, 2, 6]}

This will be more efficient that using creating a dict and reversing the values as you only have to cast to tuple once not from a tuple back to a list.

Upvotes: 0

Ozgur Vatansever
Ozgur Vatansever

Reputation: 52133

This solution deletes the keys with same values without creating a new dictionary.

seen = set()
for key in mydict.keys():
    value = tuple(mydict[key])
    if value in seen:
        del mydict[key]
    else:
        seen.add(value) 

Upvotes: 2

falsetru
falsetru

Reputation: 369044

Exchange keys and values; duplicated key-value pairs will be removed as a side effect (because dictionary does not allow duplicated keys). Exchange keys and values again.

>>> d = {'key1': [1,2,3], 'key2': [1,2,6], 'key3': [1,2,3]}
>>> d2 = {tuple(v): k for k, v in d.items()}  # exchange keys, values
>>> d = {v: list(k) for k, v in d2.items()}   # exchange again
>>> d
{'key2': [1, 2, 6], 'key1': [1, 2, 3]}

NOTE: tuple(v) was used because list is not hashable; cannot be used as key directly.

BTW, don't use dict as a variable name. It will shadow builtin function/type dict.

Upvotes: 11

user2776601
user2776601

Reputation:

I think you can do it this way also. But I don't say as there seems to be more efficient ways. It is in-line.

for i in dictionary.keys():
    if dictionary.values().count(dictionary[i]) > 1:
       del dictionary[i]

Upvotes: 0

Related Questions