[英]Two-way mapping between strings and integers
給定一組字符串和(非連續的)整數(事先已知),Python字典文字是一種直接定義從一個映射到另一個映射的方法。
但是假設你的程序的某些部分將有一個字符串並且想要相應的整數,而其他部分將有一個整數並且想要相應的字符串,那么最好的方法是什么呢? 當然我可以寫出兩個單獨的字典文字,但是這違反了DRY,或者我可以用一個使用globals()從一組輸入創建兩個字典變量的函數做一些黑客攻擊,但我不確定這是多么慣用。 推薦的方式是什么? (如果重要,我正在使用Python 2.7。)
您可以從第一個映射自動生成第二個映射:
d2 = {v:k for k, v in d1.items()}
您可以使用bidict https://pypi.python.org/pypi/bidict執行此操作。
而不是使用一對dict
,為什么不使用enum
?
當然,STDLIB enum
模塊需要3.4,但它的來源可以閱讀和反向移植,或者你可以得到半官方的反向移植過的PyPI,或任何其他幾十個的enum
包 。
例如:
>>> 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
我的猜測是,大多數時候你實際上不會在這些之間來回映射,而只是使用Color.red
而不是當前的"red"
或1
作為值。 (如果您希望能夠將該值直接用作int
或str
,請查看文檔中的其他類。)
在3.4 stdlib中應該有很好的例子,如何轉換用於使用數字的代碼並將它們映射到字符串,反之亦然,代之以使用Enum
的代碼。 不幸的是,從3.4b1開始,大多數這些例子還沒有編寫......我相信socket.AddressFamily
和一些相關的類型是迄今為止唯一的類型。 但如果你無法弄明白,請展示一個MCVE ,它應該很容易向你展示如何轉換它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.