2014-01-24 122 views
3

鑑於串對和(非連續)的整數,其在預先已知的集合之間的雙向映射,Python字典字面是從任一定義與其它的映射的簡單方法。字符串和整數

但假如你的程序的某些部分將有一個字符串,並要相應的整數,而其他人將有一個整數,並希望相應的字符串,有什麼安排最好的方法?當然,我可以寫出兩個單獨的字典文字,但是這違反了DRY,或者我可以用一個函數進行一些黑客行爲,使用globals()從一組輸入中創建兩個字典變量,但我不確定這是多麼地道。建議的方式是什麼? (我使用Python 2.7,如果它很重要。)

+1

,因爲這顯然是一種枚舉類型的,你看着各種枚舉實現? –

回答

5

你可以從你的第一個自動進行的第二映射:

d2 = {v:k for k, v in d1.items()} 
2

而不是使用一對dict S,爲什麼不使用的enum

當然的STDLIB enum模塊需要3.4,但其source可閱讀和反向移植,或者你可以得到半官方backport過的PyPI,或任何其他幾十個enum packages的。

例如:

>>> import enum 
>>> class Color(enum.Enum): 
...  red = 1 
...  green = 2 
...  blue = 3 
>>> Color.red 
<Color.red: 1> 
>>> Color['red'] 
<Color.red: 1> 
>>> Color(1) 
<Color.red: 1> 
>>> Color(1).name 
'red' 
>>> Color['red'].value 
1 

我的猜測是,大多數的時候,你不會實際映射來回它們之間,而只是使用,代替目前的"red"1Color.red,作爲值。 (如果您希望能夠直接使用該值作爲intstr,請參閱文檔中的其他類。)

應該有良好的示例遍及3.4 stdlib如何轉換代碼用於使用數字並將它們映射到字符串,反之亦然轉換爲使用Enum s的代碼。不幸的是,從3.4b1開始,這些例子中的大多數還沒有被寫入......我相信socket.AddressFamily以及一些相關的類型是目前爲止唯一的類型。但是,如果你無法弄清楚,請展示一個MCVE,並且向你展示如何轉換它應該很容易。

+0

這看起來確實不錯,但是當我下載並解壓。tar.gz的,enum.py甚至是0字節,雖然在包中的文件的其餘部分似乎是好嗎? – rwallace

+0

@rwallace:我只是用'pip install enum34'安裝它,一切正常......讓我檢查一下你的方式。 – abarnert

+0

@rwallace:好的,'enum.py'不是一個空文件,而是一個到'enum/__ init __。py'的符號鏈接。這是一些軟件包用於使相同的代碼直接從源目錄以及安裝時直接運行的技巧。 (這不是一個常用的技巧,因爲它只在包裏只有'__init __。py'的時候才起作用,在這種情況下,你真的不需要一個包......)這個技巧可能只適用於Unix。但無論如何,不​​要擔心;按照你最喜歡的方式安裝軟件包(應該是'pip',但如果沒有,那很好......),一切都會好的。 – abarnert