У меня есть проект преобразования одной базы данных другому. Один из исходных столбцов базы данных определяет категорию строки. Этот столбец должен быть отображен на новой категории в новой базе данных.
Например, давайте предположим, что исходные категории:parrot, spam, cheese_shop, Cleese, Gilliam, Palin
Теперь это является немного подробным для меня, И я хочу категоризировать эти строки как sketch, actor
- Таким образом, определите все эскизы и всех агентов как два класса эквивалентности.
>>> 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'
Какие-либо идеи, как создать изящный many-one словарь в Python?
Спасибо,
Adam
It seems to me that you have two concerns. First, how do you express your mapping originally, that is, how do you type the mapping into your new_mapping.py file. Second, how does the mapping work during the re-mapping process. There's no reason for these two representations to be the same.
Start with the mapping you like:
monty = {
('parrot','spam','cheese_shop'): 'sketch',
('Cleese', 'Gilliam', 'Palin') : 'actors',
}
then convert it into the mapping you need:
working_monty = {}
for k, v in monty.items():
for key in k:
working_monty[key] = v
producing:
{'Gilliam': 'actors', 'Cleese': 'actors', 'parrot': 'sketch', 'spam': 'sketch', 'Palin': 'actors', 'cheese_shop': 'sketch'}
then use working_monty
to do the work.
You could override dict's indexer, but perhaps the following simpler solution would be better:
>>> 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'
(Perhaps the nested for loop can be compressed an impressive one-liner, but this works and is readable.)
>>> 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'
But let me tell you, It will be slow than normal one to one dictionary.