Python使用enum模块获取枚举成员索引号的四种方法详解

 更新时间:2026年04月28日 11:18:59   作者:detayun  
在 Python 中,可以使用 enum 模块创建枚举类型,并通过遍历枚举成员来获取其索引号,本文介绍了常用的四种方法,大家可以根据自己的需要进行选择

在 Python 中,可以使用 enum 模块创建枚举类型,并通过遍历枚举成员来获取其索引号(即枚举值的序号)。以下是详细方法和示例:

方法 1:使用enum.Enum和enumerate()

通过 enumerate() 遍历枚举成员,同时获取索引和枚举值。

from enum import Enum

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

# 遍历枚举并获取索引和值
for index, color in enumerate(Color, start=1):  # start=1 表示索引从1开始(默认从0)
    print(f"Index: {index}, Name: {color.name}, Value: {color.value}")

输出:

Index: 1, Name: RED, Value: 1
Index: 2, Name: GREEN, Value: 2
Index: 3, Name: BLUE, Value: 3

方法 2:直接通过枚举成员的name和value属性

如果不需要显式遍历索引,可以直接访问枚举成员的属性:

for color in Color:
    print(f"Name: {color.name}, Value: {color.value}")

输出

Name: RED, Value: 1
Name: GREEN, Value: 2
Name: BLUE, Value: 3

方法 3:获取枚举成员的序号(基于定义顺序)

如果需要枚举成员的定义顺序序号(从 0 开始),可以通过 list(Enum).index(member) 实现:

for color in Color:
    index = list(Color).index(color)  # 获取定义顺序的索引(从0开始)
    print(f"Order Index: {index}, Name: {color.name}, Value: {color.value}")

输出:

Order Index: 0, Name: RED, Value: 1
Order Index: 1, Name: GREEN, Value: 2
Order Index: 2, Name: BLUE, Value: 3

方法 4:使用__members__属性

通过 __members__ 访问枚举的名称到成员的映射,再结合 enumerate()

for i, name in enumerate(Color.__members__, start=1):
    color = Color[name]
    print(f"Index: {i}, Name: {name}, Value: {color.value}")

输出

Index: 1, Name: RED, Value: 1
Index: 2, Name: GREEN, Value: 2
Index: 3, Name: BLUE, Value: 3

知识扩展

在 Python 的 enum 模块中,枚举成员本身并不直接提供“索引”属性,但我们可以利用枚举类的内部顺序或成员的值来获得索引。常见的获取索引的方法有以下四种,具体使用哪种取决于你的枚举定义方式(是否有自定义值)。

1. 利用 list() 转换枚举类 + index() 方法

枚举类的 __members__ 保留成员定义顺序,可以通过将其转换为列表,再使用 index() 方法获取成员的位置(从 0 开始)。

from enum import Enum
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
members = list(Color)
idx = members.index(Color.GREEN)
print(idx)  # 输出 1

优点:不依赖成员的具体值,只要定义顺序不变即可。

注意:索引从 0 开始,若希望从 1 开始,加 1 即可。

2. 使用 _member_names_ 属性获取名称列表

枚举类内置了 _member_names_ 属性,它是一个按定义顺序排列的成员名称列表。可以通过成员名来定位索引。

names = Color._member_names_
idx = names.index(Color.GREEN.name)
print(idx)  # 输出 1

说明_member_names_ 是 Python 3.11+ 公开的但并非“官方推荐”的 API,在旧版本中也可用(但内部属性)。它的用途明确,不过在实际项目中更推荐使用第一种方式。

3. 使用 __members__ 有序字典

__members__ 是一个保留定义顺序的映射(Python 3.6+ 字典有序)。可以通过将其值转换为列表来获得索引。

members_list = list(Color.__members__.values())
idx = members_list.index(Color.BLUE)
print(idx)  # 输出 2

优点:直接利用标准属性,不依赖内部名称列表。

与第一种方法的区别:第一种本质也是 list(Color),它会自动调用 __members__.values() 的转换。

4. 借助 IntEnum 将索引作为成员值

如果希望索引等于成员的值,可以使用 enum.IntEnum(或 enum.Enum 配合 auto()),让枚举值自动从 1 递增,那么成员的值本身就是索引(从 1 开始)。

from enum import IntEnum, auto
class Color(IntEnum):
    RED = auto()   # 1
    GREEN = auto() # 2
    BLUE = auto()  # 3
print(Color.GREEN.value)   # 2(索引)

特点:此时成员的值严格等于定义顺序(索引)。但要注意 IntEnum 的所有成员可以直接与整数比较,可能会有副作用。如果不希望这种比较特性,可以只用 Enum + auto() 但通过 value 获取索引。

对比总结

方法依赖枚举定义顺序是否需要自定义值索引起点
list(Enum) 索引任意0
_member_names_ 索引任意0
__members__ 索引任意0
IntEnum + auto()自动1(等于 value)

推荐:大多数情况下使用第一种方法 list(Color).index(member) 最简洁、最符合 Python 习惯,且不依赖于内部私有属性。如果你的枚举成员值需要恰好就是其顺序(例如数据库序号),那么第四种方法更适合。

总结

  • 索引需求:如果需要自定义索引(如从 1 开始),用 enumerate(Enum, start=1)
  • 定义顺序序号:用 list(Enum).index(member) 获取 0 开始的序号。
  • 直接访问属性:枚举成员的 namevalue 是最常用的属性。

根据需求选择合适的方法即可!

到此这篇关于Python使用enum模块获取枚举成员索引号的四种方法详解的文章就介绍到这了,更多相关Python获取枚举成员索引号内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决使用Spyder IDE时matplotlib绘图的显示问题

    解决使用Spyder IDE时matplotlib绘图的显示问题

    这篇文章主要介绍了解决使用Spyder IDE时matplotlib绘图的显示问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 使用python统计文件行数示例分享

    使用python统计文件行数示例分享

    当文件的尺寸非常大的时候(10G之上吧),想知道行数是个问题,提供一个使用python统计文件行数的示例,需要的朋友可以参考下
    2014-02-02
  • Python实现批量图片去重

    Python实现批量图片去重

    在日常办公的时候,我们经常需要对图片进行去重后保存,如果一张张进行寻找将会非常的耗时,下面我们就来看看如何使用Python实现批量图片去重吧
    2024-11-11
  • Pytorch之contiguous的用法

    Pytorch之contiguous的用法

    今天小编就为大家分享一篇Pytorch之contiguous的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python+opencv实现目标跟踪过程

    python+opencv实现目标跟踪过程

    这篇文章主要介绍了python+opencv实现目标跟踪过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Python视频爬虫实现下载头条视频功能示例

    Python视频爬虫实现下载头条视频功能示例

    这篇文章主要介绍了Python视频爬虫实现下载头条视频功能,涉及Python正则匹配、网络传输及文件读写等相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • 详解Python中的函数参数传递方法*args与**kwargs

    详解Python中的函数参数传递方法*args与**kwargs

    本文将讨论Python的函数参数。我们将了解args和kwargs,/和的都是什么,虽然这个问题是一个基本的python问题,但是在我们写代码时会经常遇到,比如timm中就大量使用了这样的参数传递方式
    2023-03-03
  • Flask解决跨域的问题示例代码

    Flask解决跨域的问题示例代码

    这篇文章主要介绍了Flask解决跨域的问题示例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • python2 与 python3 实现共存的方法

    python2 与 python3 实现共存的方法

    这篇文章主要介绍了python2 与 python3 实现共存的方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • django和flask哪个值得研究学习

    django和flask哪个值得研究学习

    在本篇文章里小编给大家整理的是一篇关于django和flask哪个值得研究学习内容,需要的朋友们可以参考下。
    2020-07-07

最新评论