我想遍历以下枚举的子集
class Items(enum.Enum):
item1 = 0
item2 = 1
item3 = 2
item4 = 3
item5 = 4
itm66 = 5
item7 = 6
item8 = 7
说我要:
for item in (Items.item1, Items.item2, Items.item3, Items.item4):
print(item.value)
有捷径吗?还是我需要列出要迭代的每个项目?
答案 0 :(得分:2)
使用itertools.islice
可以遍历Enum
类的一部分
from enum import Enum
from itertools import islice
class Items(Enum):
item1 = 0
item2 = 1
item3 = 2
item4 = 3
item5 = 4
itm66 = 5
item7 = 6
item8 = 7
for i in islice(Items, 4):
print(i.value)
# 0
# 1
# 2
# 3
答案 1 :(得分:0)
我需要列出要迭代的每个项目吗?
否-Enum
类是可迭代的,每个值都有属性.name
和.value
,因此您可以根据自己的需要进行过滤。例如:
for v in Items:
if v.value > 3:
break
print(v.name, v.value)
=>
item1 0
item2 1
item3 2
item4 3
有捷径吗?
取决于您要做什么。您可以通过以下几种方式使用枚举是可迭代的事实:
sorted(Items, key=lambda v: v.value)[:4]
=>获得按顺序值排序的前4个元素filter(lambda e: e.value < 5, Items)
=>获取所有序号为<5的项目{v.name: v.value for v in Items if v.value < 4}
=>获取给定过滤器的所有名称/值对的字典等
注意
根据documentation,您可以通过Items.__members__
获得Enums排序字典,因此可以在其上使用.items
来获取键/值映射。但是,(在字典中)作为值获得的实际上是具有.name
和.value
属性的对象实例。
Items.__members__
=>
mappingproxy({'item1': <Items.item1: 0>,
'item2': <Items.item2: 1>,
'item3': <Items.item3: 2>,
'item4': <Items.item4: 3>)
# so you could write
for k, v in Items.__members__.items():
if v > 3:
break
print(k, v.value)
但是我发现第一种方法更直观。
答案 2 :(得分:0)
Python枚举可以具有方法。我建议您编写一个返回可迭代的方法。在这种情况下,可能是一组:
class Items(enum.Enum):
item1 = 0
item2 = 1
item3 = 2
item4 = 3
item5 = 4
itm66 = 5
item7 = 6
item8 = 7
@classmethod
def the_best_ones(cls):
return cls.item1, cls.item2, cls.item3, cls.item4
然后:
for item in Items.the_best_ones():
print(item.value)
答案 3 :(得分:0)
Enum
并没有内置的功能可以迭代子集,但是由于可以在它们上使用list
:
>>> list(Items)[:4]
[<Items.item1: 0>, <Items.item2: 1>, <Items.item3: 2>, <Items.item4: 3>]