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

Python 字符串和整数之间的双向映射,python,python-2.7,Python,Python 2.7,给定预先已知的字符串和(非连续)整数对的集合,Python字典文本是定义从一个到另一个映射的简单方法 但是假设程序的某些部分有一个字符串并需要相应的整数,而其他部分有一个整数并需要相应的字符串,那么最好的安排方式是什么?当然,我可以写出两个单独的字典文本,但这违反了DRY,或者我可以使用globals()函数从一组输入创建两个字典变量,但我不确定这有多惯用。推荐的方法是什么?(如果重要的话,我使用的是Python 2.7。)您可以从第一个映射自动生成第二个映射: d2 = {v:k for k,

给定预先已知的字符串和(非连续)整数对的集合,Python字典文本是定义从一个到另一个映射的简单方法


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

您可以从第一个映射自动生成第二个映射:

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

您可以使用bidict来执行此操作。

为什么不使用
枚举来代替一对
dict

当然,stdlib模块需要3.4版本,但它可以用于读取和后端口,或者您可以从PyPI或其他几十个模块中获得半官方版本

例如:

>>> 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
导入枚举 >>>类颜色(enum.enum): ... 红色=1 ... 绿色=2 ... 蓝色=3 >>>颜色:红色 >>>颜色[红色] >>>颜色(1) >>>颜色(1)名称 “红色” >>>颜色['red'].值 1.
我的猜测是,大多数情况下,您实际上不会在它们之间来回映射,而只是使用
Color.red
,而不是当前的
“red”
1
作为值。(如果希望能够将该值直接用作
int
str
,请查看文档中的其他类。)


3.4 stdlib中应该有很好的例子,说明如何将使用数字的代码转换为字符串,反之亦然,并将其转换为使用
Enum
s的代码。不幸的是,截至3.4b1,这些示例中的大多数还没有编写出来……我相信,到目前为止,只有一些相关的类型已经编写出来了。但是,如果您不能理解它,请显示一个,它应该很容易向您展示如何转换它。

因为这显然是一种枚举类型,您看过各种枚举实现了吗?实际上看起来不错,但是当我下载并解包.tar.gz时,enum.py是0字节,尽管包中的其他文件似乎没有问题?@rwallace:我刚刚用
pip install enum34
安装了它,一切都正常了……让我检查一下你的方法。@rwallace:OK,
enum.py
不是一个空文件,而是指向
enum/\uu init\uuuuuuuuuuupy
的符号链接。这是一些软件包使用的一个技巧,使相同的代码直接在源目录外工作,以及在安装时工作。(这不是一个常见的技巧,因为它只在包中只有
\uuuu init\uuuu.py
的情况下起作用,在这种情况下,您实际上并不需要包…)这个技巧可能只在Unix上起作用。但是无论如何,不要担心它;以您最喜欢的方式安装软件包(应该是
pip
,但如果不是,那就好了…),一切都会好起来。好的,我尝试将
enum/uuu init_uuu.py
复制到我的项目目录中的
enum.py
,其内容看起来很好,但是无论我是
导入enum
还是
从enum导入enum
它都会说找不到名称
enum
,我还缺少什么?@rwallace:你不知道如何安装软件包吗?您几乎不想尝试将它们复制到您的项目中。只需以正常方式将它们安装到您的(系统、用户或virtualenv)站点包中,一切都会正常工作。