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)
运行之后,效果如下:
唯一枚举值
经过上面的学习,有木有读者尝试在同一个枚举中定义两个不同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
代码中创建枚举
在实际的应用中,我们往往不是直接定义枚举类。而是在程序需要时,动态的生成枚举类型。这个时候,我们有两种方式进行定义:
- 自动生成枚举类型的值:
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中的成员变量用空格分开。运行效果与上面一样,这里不在展示。
- 手动生成枚举类型的值:
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的主要内容,如果未能解决你的问题,请参考以下文章