পাইথন এনাম ক্লাস থেকে সমস্ত মান কীভাবে পাবেন?


140

আমি এনুম 4 লাইব্রেরিটি নীচে এনাম ক্লাস তৈরি করতে ব্যবহার করছি:

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]

আপনি একটি তৃতীয় পক্ষ ব্যবহার করুন। তবে এটি আরও বলেছে যে এর উদ্দেশ্য রয়েছে
মার্সিন

আমি কীভাবে [(1, 'লাল'), (2, 'নীল')
মুদ্রণ করব

এই সম্পর্কে কি: a = [(int(v), str(v)) for v in Color]এবং তারপর print(a)
মার্সিন

34
এটি সম্পর্কে কীভাবে:[(color.value, color.name) for color in Color]
ভ্লাদ-আরডিলিয়ান

2
@ ভ্লাদ-আরডিলিয়ান এর মন্তব্যটি সেরা এবং সর্বাধিক পাইথোনিক। এটি
এনাম টাইপের মূর্তিমানিক

431

আপনি নিম্নলিখিতটি করতে পারেন:

[e.value for e in Color]

1
@ ব্যবহারকারী 2340939 এটি এনামগুলির তালিকা প্রদান করে, মানগুলির তালিকা নয়। যদি আপনি এটির সাথে ঠিক থাকেন তবে আপনি সম্ভবত এটি ব্যবহার করতে পারেনlist(Color)
এন্ডোলিথ

1
এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত।
SKYFALL26

22

এনামকে যে কোনও ধরণের মান সহ ব্যবহার করতে, এটি ব্যবহার করে দেখুন:
কিছু উন্নতির সাথে আপডেট হয়েছে ... ধন্যবাদ আপনার জেফকে!

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
আমি @ স্ট্যাটিকমেডুথের পরিবর্তে @ ক্ল্যাসমেডোড ব্যবহার করব
আইএসওনক্রোমনে

1
@ আইসনেক্রোমেন আমি অনুমান করি @classmethodযে Colorক্লাসের উদাহরণ তৈরি করা দরকার । এ কারণেই staticmethodএখানে সঠিক পছন্দ বলে মনে হচ্ছে।
লিওনিড দশকো

@ লিওনিডড্যাশকো মোটেও নয় আমার উত্তর দেখুন।
ব্লুফাস্ট

@ লিওনিডড্যাশকো আপনি পরিবর্তে ব্যবহার @classmethodএবং ব্যবহার করতে পারেন return list(map(lambda c: c.value, cls))
রিপটিড 4

18

@ জেফের উত্তরের উপর ভিত্তি করে, 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

বর্গ 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__ডিক্ট আছে। @ ওজগুর প্রস্তাবিত সমাধানটি সত্যই সেরা তবে আপনি এটি করতে পারেন যা আরও কাজ করে একই কাজ করে

[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সদস্য তৈরি করার অনুমতি দেওয়ার এক আকর্ষণীয় উপায় । ... বিটিডব্লিউ, টেবিলটিতে একটি নতুন ( আমার কাছে ) বৈশিষ্ট্য আনার জন্য আপভোটেড ।
আইএবস্ট্রাক

@ আইবিস্ট্র্যাক্ট: না, এটি অনুমোদিত নয়। এনাম তৈরির পরে যদি কেউ সদস্যদের যোগ / বিয়োগের কোনও উপায় বের করে তবে তারা সম্ভবত সেই এনামকে ভেঙে ফেলবে।
ইথান ফুরম্যান

@ আইবিস্ট্র্যাক্ট: নতুন সদস্য যুক্ত করুন সত্যতার পরে সাধারণত ভাল ধারণা হয় না। আপনি যদি সত্যিই চান তবে এই উত্তরটি দেখুন
ইথান ফুরম্যান

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()))

রঙের সমস্ত বৈধ মান প্রদান করবে


-1

আপনি ইটার () ফাংশনটি ব্যবহার করতে পারেন:

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.