如何用单行表达式实现Python的batched(iterable,n)功能?
高效实现单行版
batched(iterable, n)迭代器 核心单行解决方案
针对你的需求,推荐使用iter双参数特性结合islice实现完全符合要求的单行惰性迭代器,内存占用极低,适配从单条到数十亿条的海量数据场景:
from itertools import islice # 通用单行实现,替换n为你的批次大小(如50-400) batched_iter = iter(lambda it=iter(your_iterable): tuple(islice(it, n)), tuple())
针对示例的具体用法
以你提供的模拟输入foo、批次大小2为例:
from itertools import islice foo = ('aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg',) slicepairs3 = iter(lambda it=iter(foo): tuple(islice(it, 2)), tuple()) # 遍历输出验证 for batch in slicepairs3: print(batch) # 输出结果: # ('aaa', 'bbb') # ('ccc', 'ddd') # ('eee', 'fff') # ('ggg',)
实现原理拆解
iter(callable, sentinel):利用iter的双参数模式,重复调用第一个可调用对象,直到返回值等于第二个终止值时停止迭代。lambda it=iter(your_iterable): tuple(islice(it, n)):通过lambda默认参数特性,仅初始化一次原迭代器it;每次调用时从it中截取最多n个元素转为元组,保证批次的惰性生成。- 终止值
tuple():当原迭代器耗尽后,islice返回空迭代器,转成空元组时触发迭代终止,自然保留最后一批不足n的元素。
对比现有方案的优势
- 替代
zip_longest(*[iter(foo)]*n):不会用None填充空缺元素,完全保留原始数据结构; - 替代
zip(*[iter(foo)]*n):不会丢弃最后一批不足n的元素; - 替代自定义生成器函数:无需额外定义函数,用单行表达式实现同等功能,更简洁Pythonic。
内容的提问来源于stack exchange,提问作者antiplex
相关产品推荐
相关产品推荐

