You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻找itertools/more_itertools中符合特定分组规则的Python迭代器

基于more_itertools的列表分组实现

你的需求核心是以「奇数后的第一个偶数」或「列表开头的偶数」为分组起点,包含后续所有元素直到下一个符合条件的起点前。可以用more_itertools的split_before结合with_prev实现简洁的解决方案:

实现代码

from more_itertools import split_before, with_prev

def magic_iterator(lst, is_even):
    return split_before(
        lst,
        lambda curr, prev: is_even(curr) and (prev is None or not is_even(prev)),
        with_prev(lst)
    )

# 测试示例
is_even = lambda x: x % 2 == 0
my_list = [2, 8, 7, 6, 4, 2, 4, 5, 3, 4, 1, 2]

for group in magic_iterator(my_list, is_even):
    print(list(group))

逻辑说明

  • with_prev(lst):生成带前置元素的迭代器,每个元素格式为(当前元素, 前一个元素),第一个元素的前置为None
  • split_before:在满足条件的元素前分割列表,这里的判断条件是:
    1. 当前元素是偶数
    2. 要么是列表第一个元素(前置为None),要么前一个元素是奇数
  • 最终输出的分组完全匹配你给出的预期结果

极简一行写法

如果追求极致简洁,也可以写成lambda形式:

from more_itertools import split_before, with_prev

magic_iterator = lambda lst, is_even: split_before(lst, lambda c, p: is_even(c) and (p is None or not is_even(p)), with_prev(lst))

内容的提问来源于stack exchange,提问作者koks der drache

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:01:27