2017-08-28 46 views
1

我有一个共同的要求,即从值中查找代码,并从代码中查找值。例如,我有一个颜色字典,可以让我为颜色派生一个代码。另一方面,我可能有一个代码并希望得到颜色。我通过创建我所谓的互惠词典来解决这个问题。在python中创建互惠词典

colour_list = [["red", "0"], ["green", "1"], ["blue", "2"]] 
colours = {} 
codes = {} 
for colour in colour_list: 
    colours[colour[0]] = colour[1] 
    codes[colour[1]] = colour[0] 

print colours 
print codes 

如果我知道一个代码,我可以看一下颜色代码,如果我知道我的颜色可以看一下在颜色代码

这是解决这个问题的最佳数据结构吗?有没有更pythonic的方式?

+2

听起来像是你想改为使用[enum](https://docs.python.org/3/library/enum.html)。 –

+0

在Clojure中,这被称为*倒映图*。 *倒置字典*可能是Pythonic术语。而如果你有重复的价值?你想要什么行为? – Carcigenicate

+0

通常在这种情况下没有任何键/值冲突,那么为什么不把所有内容都放在一个字典中呢?互补项可以添加:'d.update(list(zip(d.values(),d.keys())))'。 – ekhumoro

回答

6

使用Enum代替:

from enum import Enum 

class Colour(Enum): 
    red = 0 
    green = 1 
    blue = 2 

然后你可以去两种方式:

# getting the integer value for a name 
Colour[name].value 

# getting the name for a value 
Colour(value).name 

在代码中,只需直接使用成员:

colour = Colour.red 
+0

如果要使用值来访问名称,可能或者可能不需要考虑使用enum包中的'unique'装饰器。 –

+0

@OluwafemiSule:重复值被解释为*别名*; 'EnumClass(value)'会给你第一个具有该值的成员。使用'EnumClass [first_name]'或'EnumClass [alias_name]'也会给你带有值的第一个成员。请参阅[关于复制成员和值的部分](https://docs.python.org/3/library/enum.html#duplicating-enum-members-and-values)。 –

+0

@MartijnPieters谢谢。十分优雅。我知道必须有更好的方法 – Psionman