子集上的Python枚举迭代

时间:2018-10-23 20:43:24

标签: python enums

我想遍历以下枚举的子集

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)

有捷径吗?还是我需要列出要迭代的每个项目?

4 个答案:

答案 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>]