给定一组预先知道的字符串对和(非连续的)整数,Python字典文字是一种直接定义映射的方法。
但是假设你的程序的某些部分会有一个字符串并且想要相应的整数,而其他部分将有一个整数并且想要相应的字符串,那么最好的方法是什么呢?当然我可以写出两个单独的字典文字,但是这违反了DRY,或者我可以用一个使用globals()从一组输入创建两个字典变量的函数做一些黑客攻击,但我不确定这是多么惯用。推荐的方式是什么? (如果重要的话,我正在使用Python 2.7。)
答案 0 :(得分:5)
您可以从第一个映射自动生成第二个映射:
d2 = {v:k for k, v in d1.items()}
答案 1 :(得分:4)
您可以使用bidict https://pypi.python.org/pypi/bidict来执行此操作。
答案 2 :(得分:2)
为什么不使用dict
,而不是使用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
我的猜测是,大多数时候你实际上不会在这些之间来回映射,而只是使用Color.red
,而不是当前的"red"
或1
,一个值。 (如果您希望能够将该值直接用作int
或str
,请查看文档中的其他类。)
在3.4 stdlib中应该有很好的例子,说明如何转换以前用于使用数字的代码并将它们映射到字符串,反之亦然,代之以使用Enum
代码。不幸的是,从3.4b1开始,大多数这些例子尚未编写......我相信socket.AddressFamily
和一些相关的类型是迄今为止唯一的类型。但如果您无法弄清楚,请显示MCVE,并且应该很容易向您展示如何转换它。