user3456862
user3456862

Reputation: 1

How to compare values inside a dictionary to fill up sets()

dico = {"dico":   {1:"bailler",2:"bailler",3:"percer",4:"calculer",5:"calculer",6:"trouer",7:"bailler",8:"découvrir",9:"bailler",10:"miser",11:"trouer",12:"changer"}}

I have a big dictionary of dictionaries like that. I want to put identic elements together in sets. So create a kind of condition which will say if the values of "dico" are equal put them in a set():

b=[set(1,2,7,9),set(3),set(4,5),set(6,11),set(8),set(10),set(12)]

I don't know if that question has already been asked but as a new pythonner I don't have all the keys... ^^

Thank you for you answers

Upvotes: 0

Views: 85

Answers (3)

SZIEBERTH Ádám
SZIEBERTH Ádám

Reputation: 4186

The dict.setdefault() method can be handy for tasks like this, as well as dict.items() which iterates through the (key, value) pairs of the dictionary.

>>> dico = {"dico":   {1:"bailler",2:"bailler",3:"percer",4:"calculer",5:"calcul
er",6:"trouer",7:"bailler",8:"découvrir",9:"bailler",10:"miser",11:"trouer",12:"
changer"}}
>>> newdict = {}
>>> for k, subdict in dico.items():
...     newdict[k] = {}
...     for subk, subv in subdict.items():
...         newdict[k].setdefault(subv, set()).add(subk)
...
>>> newdict
{'dico': {'bailler': {1, 2, 9, 7}, 'miser': {10}, 'découvrir': {8}, 'calculer':
{4, 5}, 'changer': {12}, 'percer': {3}, 'trouer': {11, 6}}}
>>> newdict['dico'].values()
dict_values([{1, 2, 9, 7}, {10}, {8}, {4, 5}, {12}, {3}, {11, 6}])

Upvotes: 0

C.B.
C.B.

Reputation: 8326

I would reverse your dictionary and have the value a set(), then return all the values.

>>> from collections import defaultdict
>>>>my_dict= {"dico":   {1:"bailler",2:"bailler",3:"percer",4:"calculer",5:"calculer",6:"trouer",7:"bailler",8:"découvrir",9:"bailler",10:"miser",11:"trouer",12:"changer"}}
>>> my_other_dict = defaultdict(set)
>>> for dict_name,sub_dict in my_dict.iteritems():
    for k,v in sub_dict.iteritems():
        my_other_dict[v].add(k) #the value, i.e. "bailler" is now the key
                                 #e.g. {"bailler":set([1,2,9,7]),...


>>> [v for k,v in my_other_dict.iteritems()]
[set([8]), set([1, 2, 9, 7]), set([3]), set([4, 5]), set([12]), set([11, 6]), set([10])]

Of course as cynddl has pointed out, if your index in a list will always be the "key", simply enumerate a list and you won't have to store original data as a dictionary, nor use sets() as indices are unique.

Upvotes: 1

cynddl
cynddl

Reputation: 121

You should write your data this way:

dico = ["bailler", "bailler", "percer", "calculer", "calculer", "trouer", "bailler", "découvrir", "bailler", "miser", "trouer", "changer"]

If you want to count the number of identic elements, use collections.Counter:

import collections
counter=collections.Counter(dico)
print(counter)

which returns a Counter object:

Counter({'bailler': 4, 'calculer': 2, 'trouer': 2, 'd\xc3\xa9couvrir': 1, 'percer': 1, 'changer': 1, 'miser': 1})

Upvotes: 0

Related Questions