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

rwa*_*ace 3 python python-2.7

给定一组字符串和(非连续的)整数(事先已知),Python字典文字是一种直接定义从一个映射到另一个映射的方法.

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

jon*_*rpe 5

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

d2 = {v:k for k, v in d1.items()}
Run Code Online (Sandbox Code Playgroud)


aid*_*ni8 5

您可以使用 bidict https://pypi.python.org/pypi/bidict来执行此操作。


aba*_*ert 5

为什么不使用一对dicts,而使用 一个enum呢?

\n\n

当然,stdlibenum模块需要 3.4,但它的源代码可供读取和反向移植,或者您可以从 PyPI 获得半官方反向移植,或数十个其他enum软件包中的任何一个。

\n\n

例如:

\n\n
>>> import enum\n>>> class Color(enum.Enum):\n...     red = 1\n...     green = 2\n...     blue = 3\n>>> Color.red\n<Color.red: 1>\n>>> Color[\'red\']\n<Color.red: 1>\n>>> Color(1)\n<Color.red: 1>\n>>> Color(1).name\n\'red\'\n>>> Color[\'red\'].value\n1\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的猜测是,大多数时候您实际上不会在这些之间来回映射,而只是使用Color.red, 而不是当前的"red"1, 作为值。(如果您希望能够直接使用该值作为 anint或 a str,请查看文档中的其他类。)

\n\n

3.4 stdlib 中应该有很好的示例,说明如何转换过去使用数字的代码并将它们映射到字符串,反之亦然到使用Enums 的代码。不幸的是,截至 3.4b1,大多数示例尚未编写\xe2\x80\xa6 我相信socket.AddressFamily,一些相关类型是迄今为止唯一已编写的示例。但如果您无法弄清楚,请显示MCVE,并且应该很容易向您展示如何转换它。

\n