2017-08-28 54 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