'inverting' a dict

Peter Abel PeterAbel at gmx.net
Thu Jan 1 15:48:56 EST 2004


Irmen de Jong <irmen at -NOSPAM-REMOVETHIS-xs4all.nl> wrote in message news:<3ff1b688$0$319$e4fe514c at news.xs4all.nl>...
> Hi
> I have this dict that maps a name to a sequence of other names.
> I want to have it reversed, i.e., map the other names each to
> the key they belong to (yes, the other names are unique and
> they only occur once). Like this:
> 
> { "key1": ("value1", "value2"), "key2": ("value3,) }
> 
> -->
> 
> { "value1": "key1", "value2": "key1", "value3": "key2" }
> 
> What I'm doing is using a nested loop:
> 
> dict2={}
> for (key,value) in dict1.items():
>      for name in value:
>          dict2[name] = key
> 
> which is simple enough, but I'm hearing this little voice in
> the back of my head saying "there's a simpler solution".
> Is there? What is it? ;-)
> 
> Thanks
> --Irmen.

... and after all there is always a hacky one-liner:
>>> org = {"key1": ("value1", "value2"), "key2": ("value3",)}
>>> dict(reduce(lambda l,(k,v):l.extend(zip(v,(k,)*len(v))) or l,org.items(),[]))
{'value3': 'key2', 'value2': 'key1', 'value1': 'key1'}
>>> 

Happy new year
Peter



More information about the Python-list mailing list