关于枚举:在Python中设置枚举的最简洁方法是什么?

What's the cleanest way to set up an enumeration in Python?

本问题已经有最佳答案,请猛点这里访问。

我对python比较陌生,我想找出创建枚举的最简单方法。

我找到的最好的东西是:

1
(APPLE, BANANA, WALRUS) = range(3)

将苹果设为0,香蕉设为1等。

但我想知道有没有更简单的方法。


在python3.4(docs)中添加了枚举。详见PEP 0435。

如果您在python2.x上,那么pypi上就存在一个backport。

1
pip install enum34

您的使用示例与Python枚举的函数式API最相似:

1
2
3
4
>>> from enum import Enum
>>> MyEnum = Enum('MyEnum', 'APPLE BANANA WALRUS')
>>> MyEnum.BANANA
<MyEnum.BANANA: 2>

但是,这是一个更典型的用法示例:

1
2
3
4
class MyEnum(Enum):
    apple = 1
    banana = 2
    walrus = 3

如果需要枚举实例与整数进行相等比较,也可以使用IntEnum,但我不建议这样做,除非有充分的理由需要这种行为。


你可以用这个。虽然稍长,但可读性和灵活性更高。

1
2
3
4
5
from enum import Enum
class Fruits(Enum):
    APPLE = 1
    BANANA = 2
    WALRUS = 3

编辑:python 3.4


使用枚举

1
2
In [4]: list(enumerate(('APPLE', 'BANANA', 'WALRUS'),1))
Out[4]: [(1, 'APPLE'), (2, 'BANANA'), (3, 'WALRUS')]

努布的回答应该是这样的

1
2
3
In [13]: from enum import Enum

In [14]: Fruit=Enum('Fruit', 'APPLE BANANA WALRUS')

枚举值与整数不同。

1
2
3
4
5
6
7
8
In [15]: Fruit.APPLE
Out[15]: <Fruit.APPLE: 1>

In [16]: Fruit.BANANA
Out[16]: <Fruit.BANANA: 2>

In [17]: Fruit.WALRUS
Out[17]: <Fruit.WALRUS: 3>

在你的问题中,使用范围是一个更好的选择。

1
In [18]: APPLE,BANANA,WALRUS=range(1,4)

您也可以使用dict:

1
2
3
4
5
d = {
    1: 'APPLE',
    2: 'BANANA',
    3: 'WALRUS'
}

1
a = ('APPLE', 'BANANA', 'WALRUS')

可以使用enumerate创建元组列表以获得所需的输出。

1
2
list(enumerate(a, start=1))
[(1, 'APPLE'), (2, 'BANANA'), (3, 'WALRUS')]

如果您先需要'APPLE',然后需要1,则可以执行以下操作:

1
2
[(j, i +1 ) for i, j in enumerate(a)]
[('APPLE', 1), ('BANANA', 2), ('WALRUS', 3)]

此外,还可以使用enumerate创建字典以获得所需的输出。

1
2
dict(enumerate(a, start=1))
{1: 'APPLE', 2: 'BANANA', 3: 'WALRUS'}