2014-01-24 43 views
3

鉴于串对和(非连续)的整数,其在预先已知的集合之间的双向映射,Python字典字面是从任一定义与其它的映射的简单方法。字符串和整数

但假如你的程序的某些部分将有一个字符串,并要相应的整数,而其他人将有一个整数,并希望相应的字符串,有什么安排最好的方法?当然,我可以写出两个单独的字典文字,但是这违反了DRY,或者我可以用一个函数进行一些黑客行为,使用globals()从一组输入中创建两个字典变量,但我不确定这是多么地道。建议的方式是什么? (我使用Python 2.7,如果它很重要。)

+1

,因为这显然是一种枚举类型的,你看着各种枚举实现? –

回答

5

你可以从你的第一个自动进行的第二映射:

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

而不是使用一对dict S,为什么不使用的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 

我的猜测是,大多数的时候,你不会实际映射来回它们之间,而只是使用,代替目前的"red"1Color.red,作为值。 (如果您希望能够直接使用该值作为intstr,请参阅文档中的其他类。)

应该有良好的示例遍及3.4 stdlib如何转换代码用于使用数字并将它们映射到字符串,反之亦然转换为使用Enum s的代码。不幸的是,从3.4b1开始,这些例子中的大多数还没有被写入......我相信socket.AddressFamily以及一些相关的类型是目前为止唯一的类型。但是,如果你无法弄清楚,请展示一个MCVE,并且向你展示如何转换它应该很容易。

+0

这看起来确实不错,但是当我下载并解压。tar.gz的,enum.py甚至是0字节,虽然在包中的文件的其余部分似乎是好吗? – rwallace

+0

@rwallace:我只是用'pip install enum34'安装它,一切正常......让我检查一下你的方式。 – abarnert

+0

@rwallace:好的,'enum.py'不是一个空文件,而是一个到'enum/__ init __。py'的符号链接。这是一些软件包用于使相同的代码直接从源目录以及安装时直接运行的技巧。 (这不是一个常用的技巧,因为它只在包里只有'__init __。py'的时候才起作用,在这种情况下,你真的不需要一个包......)这个技巧可能只适用于Unix。但无论如何,不​​要担心;按照你最喜欢的方式安装软件包(应该是'pip',但如果没有,那很好......),一切都会好的。 – abarnert