python - 基于Enum迭代或索引列表

标签 python python-3.x list enums enumeration

我有一个包含 4 个元素的小型枚举列表(class Type(Enum): One,Two,Three,Four),我想知道是否有一种方法可以将枚举与全局列表 (List = [Type(0),Type(1),Type(2),Type(3)]。

我知道我可以使用语法 List[ Type.Two.value ] 访问此列表。但我希望有一种简单的方法可以丢失.value。这不是打字问题 - 我不介意输入长的描述性变量名称。但列表和枚举是直接相关/关联的,因此如果列表将枚举视为迭代器,那就更好了。有没有简单的方法可以实现这一点?

我正在 Blender 环境中工作,构建一个附加组件,如果这有什么区别的话。我对 python 也很陌生——大约一周了,所以如果你有明显的要点,请不要忽略它们。

我对C/C++非常熟悉,以防有任何相似之处。我非常喜欢创建数据库列表并关联迭代器类型,这种方式阻止使用除与其关联的索引类型名以外的任何内容访问列表(因此您不会犯像 Cars[my_boat_index] 这样的错误)

感谢任何建议!

最佳答案

Enum 转换为列表非常简单:

list(Type)
# [<Type.ONE: 1>, <Type.TWO: 2>, <Type.THREE: 3>, <Type.FOUR: 4>]

使用 Type 成员作为索引访问列表有点复杂:

  • 默认情况下,成员值从 1 开始
  • 但容器索引从 0 开始
  • 并且成员没有 __index____int__ 方法

简单/简单的解决方案有两个:

  • 使用IntEnum而不是Enum
  • 0开始计数

所以:

class Type(IntEnum):
    ZERO = 0
    ONE = 1
    TWO = 2
    THREE = 3

IntEnum 成员可以在 int 所在的任何地方使用,因此它们可以很好地用作索引值。

更复杂的解决方案是使用常规的Enum,添加您需要的方法,并在返回值时减1:

class Type(Enum):
    ONE = 1
    TWO = 2
    THREE = 3
    FOUR = 4

    def __index__(self):
        return self.value - 1

    def __int__(self):
        return self.value - 1

即使您添加了 __index____int__ 方法,您仍然应该从零开始计数,而不是执行减一技巧,因为这会导致更多当您习惯了 Python 的工作方式后会遇到问题。

关于python - 基于Enum迭代或索引列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57949252/

相关文章:

c# - List.Contains 对象比较失败

python - 如何检查(在模板中)用户是否属于某个组

python - 如何强制 cherrypy 接受可变数量的 GET 参数?

python - long_description 仅包含 README.rst 的第一行

Python 等待一个内部有循环的函数

java - 在数组中存储坐标并在java中比较它们的最佳方法?

python - 将来自 stdin 的整数放入列表中

python - 如何使用 Pandas 从 CSV 文件夹生成自定义主数据框?

python - 使用 win32com 和 python 的 Excel

python - 向我解释 .join() 在 Python 中如何工作