字符串和整数之间的双向映射

时间:2014-01-24 19:44:05

标签: python python-2.7

给定一组预先知道的字符串对和(非连续的)整数,Python字典文字是一种直接定义映射的方法。

但是假设你的程序的某些部分会有一个字符串并且想要相应的整数,而其他部分将有一个整数并且想要相应的字符串,那么最好的方法是什么呢?当然我可以写出两个单独的字典文字,但是这违反了DRY,或者我可以用一个使用globals()从一组输入创建两个字典变量的函数做一些黑客攻击,但我不确定这是多么惯用。推荐的方式是什么? (如果重要的话,我正在使用Python 2.7。)

3 个答案:

答案 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,一个值。 (如果您希望能够将该值直接用作intstr,请查看文档中的其他类。)

在3.4 stdlib中应该有很好的例子,说明如何转换以前用于使用数字的代码并将它们映射到字符串,反之亦然,代之以使用Enum代码。不幸的是,从3.4b1开始,大多数这些例子尚未编写......我相信socket.AddressFamily和一些相关的类型是迄今为止唯一的类型。但如果您无法弄清楚,请显示MCVE,并且应该很容易向您展示如何转换它。