Python 中如何把列表切分成等大的块(chunks)?
Python 列表分块:列表推导式 [l[i:i+n] for i in range(0, len(l), n)] 最直观;itertools 的 batched(3.12+)更优雅。本文介绍各种分块方法。
最直观的写法:列表推导式 [l[i:i+n] for i in range(0, len(l), n)]。Python 3.12+ 可以用 itertools.batched(l, n)。
方法一:列表推导式(推荐)
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = 3
chunks = [my_list[i:i+n] for i in range(0, len(my_list), n)]
print(chunks) # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
最后一块不足 n 个时自动为剩余元素,不需要特殊处理。
方法二:itertools.batched(Python 3.12+)
from itertools import batched
for chunk in batched(my_list, 3):
print(chunk) # (1, 2, 3) (4, 5, 6) (7, 8, 9) (10,)
返回迭代器(产出元组),大列表更省内存。
方法三:生成器函数
def chunked(lst, n):
for i in range(0, len(lst), n):
yield lst[i:i+n]
for chunk in chunked(my_list, 3):
process(chunk)
惰性产出,适合逐块处理大列表(如分批写数据库、分批调 API)。
典型应用:批量处理
# 每 100 条一批写入数据库
for batch in chunked(records, 100):
db.bulk_insert(batch)
常见问题(FAQ)
Q:分块大小比列表还长?
A:没问题,结果就是一整块(原列表的拷贝)。
Q:空列表呢?
A:结果为空列表 [],不会报错。
Q:numpy 数组怎么分块?
A:numpy.array_split(arr, n) 把数组分成 n 份(尽量均等),与按大小分块语义不同,注意区分。