簡體   English   中英

字符串和整數之間的雙向映射

[英]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作為值。 (如果您希望能夠將該值直接用作intstr ,請查看文檔中的其他類。)

在3.4 stdlib中應該有很好的例子,如何轉換用於使用數字的代碼並將它們映射到字符串,反之亦然,代之以使用Enum的代碼。 不幸的是,從3.4b1開始,大多數這些例子還沒有編寫......我相信socket.AddressFamily和一些相關的類型是迄今為止唯一的類型。 但如果你無法弄明白,請展示一個MCVE ,它應該很容易向你展示如何轉換它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM