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) return(new_d) > 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 inefficient... -- Alan G Author of the Learn to Program web site http://www.alan-g.me.uk/ http://www.amazon.com/author/alan_gauld Follow my photo-blog on Flickr at: http://www.flickr.com/photos/alangauldphotos _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor