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