Python 3.12+:列表想按固定大小切块,可以用 `itertools.batched`

27 次浏览3 条回复

以前写批量处理时,经常会自己切片或者手搓生成器。Python 3.12 起标准库里有个 itertools.batched,小脚本里挺顺手。

环境:Python 3.12+,只用标准库。保存成 batched-demo.py 跑:

from itertools import batched

items = ['a', 'b', 'c', 'd', 'e']

for group in batched(items, 2):
    print(group)

输出大概是:

('a', 'b')
('c', 'd')
('e',)

最后一组不够数量时会保留下来,不会丢。拿来做分页请求、分批写入这种场景,比到处写 range(0, len(items), n) 清爽一点。

补一个小细节:Python 3.13 里 batched 还多了个 strict=True。如果最后一组不够数量,就会直接抛错。

from itertools import batched

items = [1, 2, 3, 4, 5]

for group in batched(items, 2, strict=True):
    print(group)

这种比较适合“必须刚好分组”的数据,比如一行一行按固定字段数拆。普通分页还是默认行为更顺手。

这里还有个小用法:batched() 返回的是迭代器,不会一上来把所有分组都算出来。

所以如果前面接的是文件行、数据库游标这种可迭代对象,也能边取边分批处理。只是每一批给的是 tuple,如果后面函数非要 list,记得自己包一下 list(group)。

还有个容易忽略的点:第二个参数 n 不能小于 1。

from itertools import batched

print(list(batched([1, 2, 3], 0)))

Python 3.12+ 这里会直接 ValueError。如果这个批大小是从命令行参数或者配置里读的,最好先校验一下,不然报错位置会有点绕。