user1576199
user1576199

Reputation: 3207

Find same dictionary by value

I have dictionary like below

dict1 = {'a':{'a':20, 'b':30}, 'b':{'a':30, 'b':40}, 'c':{'a':20, 'b':30}, 'd':{'a':30, 'b':40}}

Then in following dictionary two dictionaries are same, so expected result will be like below

result = [['a','c'],['b','d']]

Upvotes: 1

Views: 84

Answers (2)

jamylak
jamylak

Reputation: 133514

>>> seen = {}
>>> dict1 = {'a':{'a':20, 'b':30}, 'b':{'a':30, 'b':40}, 'c':{'a':20, 'b':30}, 'd':{'a':30, 'b':40}}
>>> for k in dict1:
        fs = frozenset(dict1[k].items())
        seen.setdefault(fs, []).append(k)


>>> seen.values() # note: unordered
[['a', 'c'], ['b', 'd']]

If order is needed:

>>> from collections import OrderedDict
>>> dict1 = {'a':{'a':20, 'b':30}, 'b':{'a':30, 'b':40}, 'c':{'a':20, 'b':30}, 'd':{'a':30, 'b':40}}
>>> seen = OrderedDict()
>>> for k in sorted(dict1):
        fs = frozenset(dict1[k].items())
        seen.setdefault(fs, []).append(k)


>>> seen.values()
[['a', 'c'], ['b', 'd']]

Note: This code is currently cross-compatible on Python 2/3. On Python 2 you can make it more efficient by using .iteritems() instead of .items()

Upvotes: 4

Emmanuel
Emmanuel

Reputation: 14209

A quick one: 1st get different values, then list comprehension.

>>> values = []
>>> for k in dict1:
    if dict1[k] not in values:
        values.append(dict1[k])


>>> values
[{'a': 20, 'b': 30}, {'a': 30, 'b': 40}]
>>> [[k for k in dict1 if dict1[k] == v] for v in values]
[['a', 'c'], ['b', 'd']]

Upvotes: 0

Related Questions