Python使用enum模塊獲取枚舉成員索引號的四種方法詳解
在 Python 中,可以使用 enum 模塊創(chuàng)建枚舉類型,并通過遍歷枚舉成員來獲取其索引號(即枚舉值的序號)。以下是詳細(xì)方法和示例:
方法 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開始(默認(rèn)從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) 實現(xiàn):
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__ 訪問枚舉的名稱到成員的映射,再結(jié)合 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 模塊中,枚舉成員本身并不直接提供“索引”屬性,但我們可以利用枚舉類的內(nèi)部順序或成員的值來獲得索引。常見的獲取索引的方法有以下四種,具體使用哪種取決于你的枚舉定義方式(是否有自定義值)。
1. 利用 list() 轉(zhuǎn)換枚舉類 + index() 方法
枚舉類的 __members__ 保留成員定義順序,可以通過將其轉(zhuǎn)換為列表,再使用 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優(yōu)點:不依賴成員的具體值,只要定義順序不變即可。
注意:索引從 0 開始,若希望從 1 開始,加 1 即可。
2. 使用 _member_names_ 屬性獲取名稱列表
枚舉類內(nèi)置了 _member_names_ 屬性,它是一個按定義順序排列的成員名稱列表??梢酝ㄟ^成員名來定位索引。
names = Color._member_names_ idx = names.index(Color.GREEN.name) print(idx) # 輸出 1
說明:_member_names_ 是 Python 3.11+ 公開的但并非“官方推薦”的 API,在舊版本中也可用(但內(nèi)部屬性)。它的用途明確,不過在實際項目中更推薦使用第一種方式。
3. 使用 __members__ 有序字典
__members__ 是一個保留定義順序的映射(Python 3.6+ 字典有序)??梢酝ㄟ^將其值轉(zhuǎn)換為列表來獲得索引。
members_list = list(Color.__members__.values()) idx = members_list.index(Color.BLUE) print(idx) # 輸出 2
優(yōu)點:直接利用標(biāo)準(zhǔn)屬性,不依賴內(nèi)部名稱列表。
與第一種方法的區(qū)別:第一種本質(zhì)也是 list(Color),它會自動調(diào)用 __members__.values() 的轉(zhuǎn)換。
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(索引)特點:此時成員的值嚴(yán)格等于定義順序(索引)。但要注意 IntEnum 的所有成員可以直接與整數(shù)比較,可能會有副作用。如果不希望這種比較特性,可以只用 Enum + auto() 但通過 value 獲取索引。
對比總結(jié)
| 方法 | 依賴枚舉定義順序 | 是否需要自定義值 | 索引起點 |
|---|---|---|---|
list(Enum) 索引 | 是 | 任意 | 0 |
_member_names_ 索引 | 是 | 任意 | 0 |
__members__ 索引 | 是 | 任意 | 0 |
IntEnum + auto() | 是 | 自動 | 1(等于 value) |
推薦:大多數(shù)情況下使用第一種方法 list(Color).index(member) 最簡潔、最符合 Python 習(xí)慣,且不依賴于內(nèi)部私有屬性。如果你的枚舉成員值需要恰好就是其順序(例如數(shù)據(jù)庫序號),那么第四種方法更適合。
總結(jié)
- 索引需求:如果需要自定義索引(如從 1 開始),用
enumerate(Enum, start=1)。 - 定義順序序號:用
list(Enum).index(member)獲取 0 開始的序號。 - 直接訪問屬性:枚舉成員的
name和value是最常用的屬性。
根據(jù)需求選擇合適的方法即可!
到此這篇關(guān)于Python使用enum模塊獲取枚舉成員索引號的四種方法詳解的文章就介紹到這了,更多相關(guān)Python獲取枚舉成員索引號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python學(xué)習(xí)筆記之錯誤和異常及訪問錯誤消息詳解
這篇文章主要介紹了Python學(xué)習(xí)筆記之錯誤和異常及訪問錯誤消息,結(jié)合實例形式分析了Python錯誤和異常及訪問錯誤消息try...except語句相關(guān)使用技巧,需要的朋友可以參考下2019-08-08
如何讀取.npy文件以及如何實現(xiàn)將數(shù)組保存為圖片
這篇文章主要介紹了如何讀取.npy文件以及如何實現(xiàn)將數(shù)組保存為圖片問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
keras小技巧——獲取某一個網(wǎng)絡(luò)層的輸出方式
這篇文章主要介紹了keras小技巧——獲取某一個網(wǎng)絡(luò)層的輸出方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python接口自動化淺析數(shù)據(jù)驅(qū)動原理
這篇文章主要介紹了Python接口自動化淺析數(shù)據(jù)驅(qū)動原理,文中會詳細(xì)描述怎樣使用openpyxl模塊操作excel及結(jié)合ddt來實現(xiàn)數(shù)據(jù)驅(qū)動,有需要的朋友可以參考下2021-08-08

