python enum 클래스에서 모든 값을 얻는 방법은 무엇입니까?


140

Enum4 라이브러리를 사용하여 다음과 같이 enum 클래스를 만들고 있습니다.

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

[1, 2]어딘가에 목록 으로 인쇄하고 싶습니다 . 어떻게하면 되나요?

답변:


48

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]

타사를 사용합니다. 그러나 그것은 또한 그것이 인턴을 가지고 있다고 말합니다
Marcin

[(1, 'RED'), (2, 'BLUE')]와 같이 인쇄하는 방법
user1159517

무엇 이것에 대해 : a = [(int(v), str(v)) for v in Color]다음 print(a).
Marcin

34
이 방법에 대해 :[(color.value, color.name) for color in Color]
블라드 - ardelean

2
@ vlad-ardelean의 의견은 가장 훌륭하고 가장 pythonic입니다. 우아하고 눈에 잘
띄는

431

다음을 수행 할 수 있습니다.

[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
@ staticmethod 대신 @classmethod를 사용합니다
ISONecroMAn

1
@ISONecroMAn 클래스의 @classmethod인스턴스를 만들어야한다고 생각 합니다 Color. 이것이 바로 staticmethod여기에 올바른 선택 인 것 같습니다.
Leonid Dashko

@LeonidDashko는 전혀 없습니다. 내 대답을 참조하십시오.
blueFast 2019

@LeonidDashko @dangoonfast이 맞습니다. 대신 사용 @classmethod하고 사용할 수 있습니다 return list(map(lambda c: c.value, cls)).
Riptyde411-11-21

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__DICT을. @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멤버 를 작성 하는 흥미로운 방법 입니다. ... btw, 테이블에 새로운 ( 나에게 ) 속성을 가져 오기 위해 투표했습니다 .
IAbstract

@IAbstract : 아니요, 허용되지 않습니다. 누군가 열거 형을 만든 후 멤버를 추가 / 빼는 방법을 알아 내면 아마도 해당 열거 형을 깨뜨릴 것입니다.
Ethan Furman

@IAbstract : 사실은 좋은 생각이 아니라면 새 회원을 추가하십시오. 정말로 원한다면 이 답변을 확인하십시오 .
Ethan Furman

1

사용 _member_names_이 즉, 단지 이름 인 경우 빠른 쉽게 결과를

Color._member_names_

또한 _member_map_요소의 순서가 지정된 사전을 반환합니다. 이 함수는를 반환 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.