Обмен ключами и значениями с вложенными элементами значений - PullRequest
3 голосов
/ 11 января 2012

У меня есть список стандартных имен

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

и словарь псевдонимов (в данном случае псевдонимы)

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

Я хочу создать новый словарь, который я могу поместитьлюбое из псевдонимов в качестве ключа, и оно возвратит стандартное имя AKA, поменяйте местами ключ и значение

До сих пор я только догадывался, что это

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

.удобочитаемый способ сделать это (id предпочитают не иметь временный словарь t).

Ответы [ 4 ]

5 голосов
/ 11 января 2012

Я думаю, что это будет более читабельным:

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

Если вы предпочитаете какую-либо форму выражения генератора, вы можете использовать их:

Python> = 2.7:

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

Python <2.7: </p>

rev_aliases = dict((nick, name)
                   for name, nick_list in aliases.iteritems()
                   for nick in nick_list)
1 голос
/ 11 января 2012

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

1 голос
/ 11 января 2012
>>> 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']
>>> 

Понимание списка потрясающее.

0 голосов
/ 11 января 2012

Интересный способ злоупотребить 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'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...