Python枚举遍历子集

7
我想要在以下枚举的子集上进行迭代:
class Items(enum.Enum):
    item1 = 0
    item2 = 1
    item3 = 2
    item4 = 3
    item5 = 4
    item6 = 5
    item7 = 6
    item8 = 7

假设我想要:

for item in (Items.item1, Items.item2, Items.item3, Items.item4):
        print(item.value)

有没有捷径?还是我需要列出每个项目进行迭代?

我不明白你在问什么。你想要迭代的内容似乎是随意的,并且取决于这个例子。 - roganjosh
3
你可以使用 itertools.islice。示例代码为:for item in islice(Items, 4) - Peter Wood
4个回答

7
使用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

2

Python枚举可以拥有方法。我建议你编写一个返回可迭代对象的方法,可能是一个Set集合,在这种情况下:

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)

1

枚举类型中没有内置的方法可以迭代子集,但是由于您可以在它们上使用list

>>> list(Items)[:4]
[<Items.item1: 0>, <Items.item2: 1>, <Items.item3: 2>, <Items.item4: 3>]

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}` => 给定过滤器,获取所有名称/值对的字典
等等。
注意:
根据文档,您可以通过`Items.__members__`获取枚举有序字典,因此您可以在其上使用`.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)

然而我觉得第一种方法更直观。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接