寻找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):生成带前置元素的迭代器,每个元素格式为(当前元素, 前一个元素),第一个元素的前置为Nonesplit_before:在满足条件的元素前分割列表,这里的判断条件是:- 当前元素是偶数
- 要么是列表第一个元素(前置为
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
相关产品推荐
相关产品推荐

