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

如何用单行表达式实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:52:23