Paul Seeb
Paul Seeb

Reputation: 6156

Swapping keys and values with nested value items

I have a list of standard names

standard = ["Richard","Robert","Nicolas"]

and a dictionary of aliases (in this case nicknames)

aliases = {standard[0]:["Richard","Rick","Dick","Rich"],
           standard[1]:["Robert","Roberto","Bob"],
           standard[2]:["Nicolas","Nick","Nic"]}

I want to make a new dictionary that I can put any of the alias names in as a key and it will return the standard name AKA swap the key and value

My only guess so far was this

t = {}
aliases = [t.update(zip(v,[k]*len(v))) for k,v in aliases.items()]
aliases = t

is there a neater or more readable way to do this (id prefer not having the temporary dictionary t).

Upvotes: 4

Views: 257

Answers (4)

jterrace
jterrace

Reputation: 67083

A fun way to abuse itertools:

>>> from itertools import izip, repeat, chain
>>> dict(chain.from_iterable(
        izip(iter(b), repeat(a, len(b)))
        for a, b in aliases.iteritems()))
{'Nicolas': 'Nicolas',
 'Richard': 'Richard',
 'Nic': 'Nicolas',
 'Robert': 'Robert',
 'Dick': 'Richard',
 'Roberto': 'Robert',
 'Nick': 'Nicolas',
 'Rick': 'Richard',
 'Rich': 'Richard',
 'Bob': 'Robert'}

Upvotes: 0

khachik
khachik

Reputation: 28703

dict((nick, name) for name, nicks in aliases.iteritems() for nick in nicks)

Upvotes: 1

TyrantWave
TyrantWave

Reputation: 4673

>>> standard = ["Richard","Robert","Nicolas"] 
>>> aliases = {standard[0]:["Richard","Rick","Dick","Rich"], 
           standard[1]:["Robert","Roberto","Bob"] ,
           standard[2]:["Nicolas","Nick","Nic"] }
>>> def name(nickname):
        return [n for n in aliases if nickname in aliases[n]]

>>> name('Bob')
['Robert']
>>> 

List comprehensions are awesome.

Upvotes: 1

Sven Marnach
Sven Marnach

Reputation: 602105

I think this would be more readable:

rev_aliases = {}
for name, nick_list in aliases.iteritems():
    for nick in nick_list:
        rev_aliases[nick] = name

If you prefer some form of generator expression you can use these:

Python >= 2.7:

rev_aliases = {nick: name 
               for name, nick_list in aliases.viewitems()
               for nick in nick_list}

Python < 2.7:

rev_aliases = dict((nick, name)
                   for name, nick_list in aliases.iteritems()
                   for nick in nick_list)

Upvotes: 6

Related Questions