17

あるデータベースを別のデータベースに変換するプロジェクトがあります。元のデータベース列の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'}

それはかなり厄介です-私は次のようなものを持っていることを好みます:

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でエレガントな多対1の辞書を作成する方法はありますか?

4

4 に答える 4

16

あなたには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、作業を​​行うために使用します。

于 2009-12-17T11:32:48.623 に答える
5

dictのインデクサーをオーバーライドすることもできますが、おそらく次のより単純なソリューションの方が適しています。

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

(おそらく、ネストされたforループは印象的なワンライナーを圧縮できますが、これは機能し、読み取り可能です。)

于 2009-12-17T11:28:47.600 に答える
2

同じ値を指す複数のキーが必要な場合、つまり

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

于 2016-07-24T02:27:45.370 に答える
1
>>> 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の辞書よりも遅くなります。

于 2009-12-17T11:20:08.107 に答える