我使用Enum4库创建一个枚举类如下:

class Color(Enum):
    RED = 1
    BLUE = 2

我想把[1,2]作为一个列表打印出来。我怎样才能做到这一点呢?


当前回答

enum类。Enum是一个解决所有枚举需求的类,因此您只需要继承它,并添加自己的字段。然后从那时起,你所需要做的就是调用它的属性:name & value:

from enum import Enum

class Letter(Enum):
   A = 1
   B = 2
   C = 3

print({i.name: i.value for i in Letter})
# prints {'A': 1, 'B': 2, 'C': 3}

其他回答

只使用:

[e.value for e in Color]

生产:

[1, 2]

要获得名称,请使用:

[e.name for e in Color]

生产:

(“红”、“蓝”)

这里有一些例子,可以轻松地将Enum转换为int, str或Enum的列表/数组,并能够排序。

import numpy as np

class Color(int,Enum):
    YELLOW = 3
    RED = 1
    BLUE = 2
    
print('1):',list(Color))
print('2):',np.array(list(Color))) ## int64 (8 bytes)
print('3):',sorted(np.array(Color, dtype=str)))
print('4):',np.array(sorted(Color), dtype=object))
print('5):',np.array(sorted(Color), dtype=np.int8)) # 1 byte
print('6):',np.array(sorted(Color, key=lambda x: -x.value), dtype=np.int8))
print('7):',np.array(sorted(Color, key=lambda x: str(x)), dtype=np.int8))

class Color(tuple,Enum):
    YELLOW = (3,3)
    RED = (1,1)
    BLUE = (2,2)
    
print('8):',np.array(sorted(Color)))
print('9):',list(map(tuple,sorted(Color, key=lambda x: -x[1]))))

输出:

1): [<Color.YELLOW: 3>, <Color.RED: 1>, <Color.BLUE: 2>]
2): [3 1 2]
3): ['Color.BLUE', 'Color.RED', 'Color.YELLOW']
4): [<Color.RED: 1> <Color.BLUE: 2> <Color.YELLOW: 3>]
5): [1 2 3]
6): [3 2 1]
7): [2 1 3]
8): [[1 1]
 [2 2]
 [3 3]]
9): [(3, 3), (2, 2), (1, 1)]

你可以使用IntEnum:

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2


print(int(Color.RED))   # prints 1

获取整型数组的列表:

enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]

要对任何类型的值使用Enum,请尝试以下方法: 更新了一些改进…谢谢@杰夫,谢谢你的小费!

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 'GREEN'
    BLUE = ('blue', '#0000ff')

    @staticmethod
    def list():
        return list(map(lambda c: c.value, Color))

print(Color.list())

结果:

[1, 'GREEN', ('blue', '#0000ff')]

Enum有一个__members__字典。 @ozgur提出的解决方案确实是最好的,但你可以这样做,它做的是同样的事情,但需要更多的工作

(颜色。color . __member__ .items()中color_name的值

__members__字典可以派上用场,如果你想在其中动态地插入东西…在一些疯狂的情况下。

(编辑) 显然__members__不是一个字典,而是一个映射代理。这意味着你不能轻易地向它添加项目。

你也可以做一些奇怪的事情,比如MyEnum。__dict__['_member_map_']['new_key'] = 'new_value',然后你可以使用像myenumer .new_key....这样的新键但这只是一个实现细节,不应该玩弄。黑魔法需要大量的维护费用。