Как получить все значения из класса перечисления python?


141

Я использую библиотеку Enum4 для создания класса перечисления следующим образом:

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

Я хочу [1, 2]где-нибудь распечатать список. Как мне этого добиться?

Ответы:


49

Вы можете использовать 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]

Вы используете сторонний. Но в нем также говорится, что у него есть интенум
Марчин

Как мне напечатать как [(1, 'RED'), (2, 'BLUE')]
user1159517 08

Насчет этого: a = [(int(v), str(v)) for v in Color]а потом print(a).
Marcin

34
Как насчет этого:[(color.value, color.name) for color in Color]
vlad-ardelean

2
Комментарий @ vlad-ardelean - лучший и самый питонический. Это идиоматическое использование типа Enum, элегантное и в высшей степени читаемое
dusktreader

432

Вы можете сделать следующее:

[e.value for e in Color]

1
@ user2340939 Возвращает список перечислений, а не список значений. Если вас это устраивает, можете использоватьlist(Color)
endolith

1
Это должно быть помечено как правильный ответ.
SKYFALL26,

22

Чтобы использовать Enum с любым типом значения, попробуйте следующее:
Обновлено с некоторыми улучшениями ... Спасибо, @Jeff, за ваш совет!

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')]

6
Я бы использовал @classmethod вместо @ staticmethod
ISONecroMAn

1
@ISONecroMAn Я думаю @classmethod, потребуется создать экземпляр Colorкласса. Поэтому staticmethodвыбор здесь кажется правильным.
Леонид Дашко

@LeonidDashko совсем нет. Смотри мой ответ.
blueFast

@LeonidDashko @dangoonfast правильно. Вы можете использовать @classmethodи использовать return list(map(lambda c: c.value, cls))вместо этого.
Riptyde4

18

Основываясь на ответе @Jeff, проведен рефакторинг для использования, classmethodчтобы вы могли повторно использовать тот же код для любого из ваших перечислений:

from enum import Enum

class ExtendedEnum(Enum):

    @classmethod
    def list(cls):
        return list(map(lambda c: c.value, cls))

class OperationType(ExtendedEnum):
    CREATE = 'CREATE'
    STATUS = 'STATUS'
    EXPAND = 'EXPAND'
    DELETE = 'DELETE'

print(OperationType.list())

Производит:

['CREATE', 'STATUS', 'EXPAND', 'DELETE']

7

class 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}

6

Так что Enumесть __members__диктат. Решение, предложенное @ozgur, действительно лучшее, но вы можете сделать то же самое, но с большей работой.

[color.value for color_name, color in Color.__members__.items()]

__members__Словарь может пригодиться , если вы хотите , чтобы вставить материал динамически в нем ... в какой - то сумасшедшей ситуации.

[РЕДАКТИРОВАТЬ] Видимо __members__это не словарь, а прокси карты. Это означает, что вы не можете легко добавлять в него элементы.

Однако вы можете делать такие странные вещи, как MyEnum.__dict__['_member_map_']['new_key'] = 'new_value', а затем вы можете использовать новый ключ, например MyEnum.new_key.... но это всего лишь деталь реализации, и с ней не следует играть. Черная магия оплачивается огромными затратами на обслуживание.


Просто боковая панель: можно ли добавлять элементы __members__? Это был бы интересный способ разрешить расширения, тем самым создавая новых Enumучастников. ... кстати, проголосовали за добавление нового ( для меня ) атрибута в таблицу.
IAbstract

@IAbstract: Нет, это запрещено. Если кто-то найдет способ добавления / вычитания членов после создания Enum, он, вероятно, сломает это Enum.
Итан Фурман,

@IAbstract: добавлять новых участников постфактум - не самая лучшая идея. Если вы действительно хотите, ознакомьтесь с этим ответом .
Итан Фурман,

1

Используйте _member_names_для быстрого и легкого результата, если это только имена, т.е.

Color._member_names_

Кроме того, у вас есть _member_map_который возвращает упорядоченный словарь элементов. Эта функция возвращает a collections.OrderedDict, так что у вас есть Color._member_names_.items()и Color._member_names_.values()с чем можно поиграть. Например

return list(map(lambda x: x.value, Color._member_map_.values()))

вернет все допустимые значения Color


-1

вы можете использовать функцию iter ():

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2
l=[]
for i in iter(Color):
    l.append(i.value)
print(l)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.