Python数据结构与算法---枚举类型enum

Posted 李元静

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据结构与算法---枚举类型enum相关的知识,希望对你有一定的参考价值。

前言

之所以博主思考再三,开设一个数据结构的基础冷门课程。是因为目前大多数数据结构的书籍都使用的是C/C++,无疑增加了学习的门槛。

而python语言相对来说,更容易入门掌握,通过python学习数据结构与算法,对于初学者似乎更加的友好。

本篇,首先介绍的是枚举类型。在python库中,提供了枚举模块enum。通过该模块,我们可以定义程序员容易理解的字面量整数与字符串。

创建枚举

话不多说,我们先来创建一个简单的枚举类:星期。也就是让程序员容易理解的星期几的枚举类。具体定义方式如下:

import enum

class Week(enum.Enum):
    Monday = 1
    Tuesday = 2
    Wednesday = 3
    Thursday = 4
    Friday = 5
    Saturday = 6
    Sunday = 7

print("name", Week.Monday.name)
print("value", Week.Monday.value)

运行之后,控制台输出如下:
枚举定义

从上面的代码,我们知道,定义一个枚举类,必须派生Enum。而且还要定义描述值的类属性name与具体的值value。

迭代枚举

这里,因为是我们主动定义的枚举类,所以我们能知道具体的name和value。但是多数情况下,我们引用别人定义的枚举类,并不清楚具体的name与value。这个时候,就需要遍历来获取其枚举的各个成员。

下面,我们来遍历上面的星期枚举,具体代码如下所示:

import enum


class Week(enum.Enum):
    Monday = 1
    Tuesday = 2
    Wednesday = 3
    Thursday = 4
    Friday = 5
    Saturday = 6
    Sunday = 7


for i in Week:
    print("name=", i.name, end="   ")
    print("value=", i.value)

运行之后,name和value都会显示出来。
迭代枚举

比较枚举

因为枚举具体的值可以是任意类型。所以枚举类型并不能比较大小,只能比较是否相等。我们来看一个简单的例子:

import enum


class Week(enum.Enum):
    Monday = 1
    Tuesday = 2
    Wednesday = 3
    Thursday = 4
    Friday = 5
    Saturday = 6
    Sunday = 7


one_Week = Week.Monday
print(one_Week == Week.Monday)
print(one_Week == Week.Tuesday)
print(one_Week > Week.Tuesday)

运行之后,效果如下:
比较枚举

可以看到,比较枚举大小时,会产生TypeError异常。

enum.IntEnum

当然,如果你想比较枚举的大小。还可以变更继承的枚举类型。比如上面的星期枚举都是整型,那么直接派生自枚举整型。这样,就可以相互比较了,具体代码如下:

import enum


class Week(enum.IntEnum):
    Monday = 1
    Tuesday = 2
    Wednesday = 3
    Thursday = 4
    Friday = 5
    Saturday = 6
    Sunday = 7


one_Week = Week.Monday
print(one_Week == Week.Monday)
print(one_Week == Week.Tuesday)
print(one_Week > Week.Tuesday)

运行之后,效果如下:
比较枚举2

唯一枚举值

经过上面的学习,有木有读者尝试在同一个枚举中定义两个不同name等于相同的值呢?这种情况下,枚举是怎么处理的?

我们先来看一段代码:

import enum


class Week(enum.IntEnum):
    Monday = 1
    Tuesday = 2
    Wednesday = 3
    Thursday = 4
    Friday = 5
    Saturday = 6
    Sunday = 7

    Mon= 1
    Tue= 2


for i in Week:
    print("name=", i.name, end="   ")
    print("value=", i.value)

这里,博主在星期枚举中,添加了2个星期缩写,而且也等于1,2。运行之后,你会发现这2个值没有输出。这是因为,相同值的枚举成员会默认被认为是前一个成员的别名。这样做的好处是防止迭代时出现重复的值。
唯一值

如果你想定义的枚举类型中,没有相同值的成员。可以为定义的枚举类添加修饰符@unique。这个时候,如果有值相同的成员,就会报错。

import enum

@enum.unique
class Week(enum.IntEnum):
    Monday = 1
    Tuesday = 2
    Wednesday = 3
    Thursday = 4
    Friday = 5
    Saturday = 6
    Sunday = 7
    
    Mon= 1
    Tue= 2

报错

代码中创建枚举

在实际的应用中,我们往往不是直接定义枚举类。而是在程序需要时,动态的生成枚举类型。这个时候,我们有两种方式进行定义:

  1. 自动生成枚举类型的值:
import enum

Week=enum.Enum(
    value="Week",
    names=('Monday Tuesday Wednesday Thursday Friday Saturday Sunday '),
)

for i in Week:
    print("name=", i.name, end="   ")
    print("value=", i.value)

这里,会自动从1给name中每一个成员变量进行赋值,names中的成员变量用空格分开。运行效果与上面一样,这里不在展示。

  1. 手动生成枚举类型的值:
import enum

Week = enum.Enum(
    value="Week",
    names=[
        ('Monday', 1),
        ('Tuesday', 2),
        ('Wednesday', 3),
        ('Thursday', 4),
        ('Friday', 5),
        ('Saturday', 6),
        ('Sunday', 7),
    ],
)

for i in Week:
    print("name=", i.name, end="   ")
    print("value=", i.value)

这种方式创建,可以给每个成员手动指定值。要说哪个更方便,还是要结合实际的情况进行判断。

以上是关于Python数据结构与算法---枚举类型enum的主要内容,如果未能解决你的问题,请参考以下文章

如何解决mysql enum 类型字段的插入问题

pydantic学习与使用-9.枚举类型(enum)

人生苦短之Python枚举类型enum

python数据类型:枚举enum和json

Python数据类型:枚举enum和json

在mysql中创建出来的数据表,性别用这个类型enum(‘男’,‘女'),为啥不显示呢,如图