質問

私は別のものに1つのデータベースを変換するプロジェクトを持っています。オリジナルのデータベース列の一つは、行のカテゴリを定義します。この列には、新しいデータベース内に新しいカテゴリにマッピングする必要があります。

たとえば、のは、元のカテゴリがあると仮定してみましょう:parrot, spam, cheese_shop, Cleese, Gilliam, Palin

今、それは私のために少し冗長だ、と私はsketch, actorとして分類これらの行を持つようにしたい - つまり、2つの同値クラスとして、すべてのスケッチや、すべての俳優を定義する

>>> monty={'parrot':'sketch', 'spam':'sketch', 'cheese_shop':'sketch', 
'Cleese':'actor', 'Gilliam':'actor', 'Palin':'actor'}
>>> monty
{'Gilliam': 'actor', 'Cleese': 'actor', 'parrot': 'sketch', 'spam': 'sketch', 
'Palin': 'actor', 'cheese_shop': 'sketch'}

それは私のようなものを持っ好むかなりawkward-です

monty={ ('parrot','spam','cheese_shop'): 'sketch', 
        ('Cleese', 'Gilliam', 'Palin') : 'actors'}

しかし、これは、もちろん、キーとして全体のタプルを設定します:

>>> monty['parrot']

Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    monty['parrot']
KeyError: 'parrot'

Pythonでエレガントな多対一の辞書を作成する方法任意のアイデア?

おかげで、

アダム

役に立ちましたか?

解決

次の2つの懸念を持っているように私には思えます。まず、あなたが最初にあなたのマッピングを表現しないか、つまり、どのようにあなたのnew_mapping.pyファイルにマッピングを入力します。第二に、どのように再マッピング処理中のマッピング作業を行います。これら2つの表現は同じにするための理由はありません。

あなたが好きなマッピングを開始します:

monty = { 
    ('parrot','spam','cheese_shop'): 'sketch', 
    ('Cleese', 'Gilliam', 'Palin') : 'actors',
}

あなたが必要とするマッピングに変換

working_monty = {}
for k, v in monty.items():
    for key in k:
        working_monty[key] = v

生産ます:

{'Gilliam': 'actors', 'Cleese': 'actors', 'parrot': 'sketch', 'spam': 'sketch', 'Palin': 'actors', 'cheese_shop': 'sketch'}

その後、仕事をするためにworking_montyを使用します。

他のヒント

あなたが辞書のインデクサーをオーバーライドすることができ、おそらく以下の簡単な解決策が良いだろう。

>>> assoc_list = ( (('parrot','spam','cheese_shop'), 'sketch'), (('Cleese', 'Gilliam', 'Palin'), 'actors') )
>>> equiv_dict = dict()
>>> for keys, value in assoc_list:
    for key in keys:
        equiv_dict[key] = value


>>> equiv_dict['parrot']
'sketch'
>>> equiv_dict['spam']
'sketch'

(おそらくループの入れ子になったが印象的なワンライナーを圧縮することができますが、これは動作し、読みやすいです。)

>>> monty={ ('parrot','spam','cheese_shop'): 'sketch', 
        ('Cleese', 'Gilliam', 'Palin') : 'actors'}

>>> item=lambda x:[z for y,z in monty.items() if x in y][0]
>>>
>>> item("parrot")
'sketch'
>>> item("Cleese")
'actors'

しかし、それは通常より1 1つの辞書に遅くなり、私はあなたを教えてみましょう。

あなたは同じ値を指す複数のキーを持つようにしたい場合は、すなわち

m_dictionary{('k1', 'k2', 'k3', 'k4'):1, ('k5', 'k6'):2}としてそれらにアクセスする、

`print(m_dictionary['k1'])` ==> `1`.

このマルチ辞書のpythonモジュールmulti_key_dictを確認してください。インストールし、それをインポートします。 https://pypi.python.org/pypi/multi_key_dictする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top