[Tutor] Dictionary viceversa

Alan Gauld alan.gauld at yahoo.co.uk
Mon Jul 30 14:06:10 EDT 2018

On 30/07/18 13:40, Valerio Pachera wrote:

> users = {'user1':['office-a', 'office-b'],
>      'user2':['office-b'],
>      'user3':['office-a','office-c']}
> It's a list of users.
> For each user there's a list of room it can access to.
> I wish to get the same info but "sorted" by room.

Remember that dicts are not sorted. You can create a dictionary
keyed by room but not sorted by room.
(You can however get a list of sorted keys but that's different,
and you can use a collections.OrderedDict)

> And i generalized it in a function like this:
> def viceversa(d):
>     new_d = dict()
>     for k in d:
>         for e in d[k]:
>             if e in new_d:
>                 new_d[e].append(k)
>             else:
>                 new_d[e] = []
>                 new_d[e].append(k)
>     return(new_d)
> My question is: is there a better way to that?

There are lots of options including those suggested elsewhere.
Another involves using get() which makes your function
look like:

def viceversa(d):
    new_d = dict()
    for k in d:
        for e in d[k]:
            new_d[e] = new_d.get(e,[]).append(k)

> Maybe by list comprehension?

I can't think of a reasonable way of doing that but a
generator may work.

Another option would be to build a set of the original
rooms then iterate over the data, collecting the keys
which have those rooms. But that would be pretty

Alan G
Author of the Learn to Program web site
Follow my photo-blog on Flickr at:

More information about the Tutor mailing list