Pythonの多対1のマッピング(同値クラスを作成します)
-
20-09-2019 - |
質問
私は別のものに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する