python enumクラスからすべての値を取得するにはどうすればよいですか?


140

Enum4ライブラリを使用して、次のように列挙型クラスを作成しています。

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

intのリストを取得するには:

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

サードパーティのものを使用します。しかし、それはまたそれがintenumを持っていると言います
Marcin

[(1、 'RED')、(2、 'BLUE')]のように印刷するには
user1159517

これは何について:a = [(int(v), str(v)) for v in Color]、その後print(a)
Marcin、2015

34
これはどうですか:[(color.value, color.name) for color in Color]
vlad-ardelean 2016

2
@ vlad-ardeleanのコメントは最高で最もpythonicです。それはEnum型の慣用的な使用法であり、エレガントで
非常に

431

次のことができます。

[e.value for e in Color]

1
@ user2340939これは、値のリストではなく列挙型のリストを返します。list(Color)
それで

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 2018

1
@ISONecroMAn クラスの@classmethodインスタンスを作成する必要があると思いますColor。だからこそ、staticmethodここでは正しい選択のようです。
Leonid Dashko

@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は、列挙のニーズをすべて解決するクラスなので、継承するだけで、独自のフィールドを追加できます。その後、それ以降は、その属性を呼び出すだけです:namevalue

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を壊すでしょう。
Ethan Furman 2016年

@IAbstract:事実が通常良い考えではない後に新しいメンバーを追加します。本当にしたい場合は、この回答を確認してください。
イーサンファーマン2016

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.