我有一个将一个数据库转换为另一个数据库的项目。其中一个原始数据库列定义行的类别。此列应映射到新数据库中的新类别。
例如,我们假设原始类别为:parrot, spam, cheese_shop, Cleese, Gilliam, Palin
现在这对我来说有点冗长,我希望将这些行分类为sketch, actor
- 也就是说,将所有草图和所有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'
如何在Python中创建优雅的多对一字典?
谢谢,
亚当
答案 0 :(得分:12)
在我看来,你有两个问题。首先,如何最初表达映射,即如何在new_mapping.py文件中键入映射。其次,映射在重映射过程中如何工作。这两种表示没有理由相同。
从您喜欢的地图开始:
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
来完成工作。
答案 1 :(得分:4)
你可以覆盖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循环可以压缩一个令人印象深刻的单行,但这是有效的,并且是可读的。)
答案 2 :(得分: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'
但是,让我告诉你,它会比一般的一对一字典慢。
答案 3 :(得分:0)
如果您想让多个键指向相同的值,即
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