2012-01-11 13 views
3

私は標準名(この場合はニックネームで)入れ替えるキーと値

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は一時的な辞書を持たない方が良いです)。

+1

リストの内包表記にのみ使用してください。あなたのコードでは、リストは 'None'値で構成されており、明らかに無用です。このようなリストの理解を単純なforループに変換するためには、はるかに読みやすいコードを作成します。 –

答えて

5

私はこれをより読みになると思います。

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} 

パイソン< 2.7:

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

私はループが最も読みやすいと思った。ジェネレータは、私が作ろうとしていたものです。良い答えをありがとう! –

1
>>> 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

'name()'はすべての 'aliases'を繰り返し処理します。これはSvenMarnachのコードのような辞書アクセスよりもはるかに遅くなります。 – AdamKG

+1

真実ですが、同じ名前( "クリス" - > "クリスチャン"、 "クリスティン"、 "ウィリー" - > "ビル"、 "ウィリアム")に解決する2つのニックネームがあると、その価値。それを処理するために彼のメソッドを変更することは、私が思うに自明ではありませんが、本当に – TyrantWave

1

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

0

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'} 
関連する問題