繁体   English   中英

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

[英]Two-way mapping between strings and integers

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

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

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

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

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

而不是使用一对dict ,为什么不使用enum

当然,STDLIB enum模块需要3.4,但它的来源可以阅读和反向移植,或者你可以得到半官方的反向移植过的PyPI,或任何其他几十个的enum

例如:

>>> 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 ,它应该很容易向你展示如何转换它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM