如何将列表分割成大小均匀的块

如何将列表分割成大小均匀的块

技术背景

在Python编程中,我们经常会遇到需要将一个列表分割成大小均匀的块的需求,例如在处理大量数据时,为了提高处理效率,我们可能需要将数据分成多个小的块进行处理。

实现步骤

1. 使用生成器实现

1
2
3
4
5
6
7
def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i:i + n]

import pprint
pprint.pprint(list(chunks(range(10, 75), 10)))

2. 列表推导式实现

1
2
3
4
5
# Python 3
[lst[i:i + n] for i in range(0, len(lst), n)]

# Python 2
[lst[i:i + n] for i in xrange(0, len(lst), n)]

3. 使用numpy.array_split

1
2
3
4
import numpy as np

lst = range(50)
np.array_split(lst, 5)

4. 使用itertools模块

1
2
3
4
5
6
7
8
9
10
11
12
13
# Python 3
from itertools import zip_longest

def grouper(n, iterable, padvalue=None):
"grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

# Python 2
from itertools import izip_longest as zip_longest

def grouper(n, iterable, padvalue=None):
"grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

5. Python 3.12+ 使用itertools.batched

1
2
3
4
5
import itertools as it

iterable = range(11)
n = 3
list(it.batched(iterable, n))

核心代码

生成器实现

1
2
3
def chunks(lst, n):
for i in range(0, len(lst), n):
yield lst[i:i + n]

itertools.batched实现

1
2
3
4
5
6
import itertools as it

iterable = range(11)
n = 3
result = list(it.batched(iterable, n))
print(result)

最佳实践

选择合适的方法

  • 如果列表长度较小,可以使用简单的列表推导式。
  • 如果需要处理大量数据,建议使用生成器,以节省内存。
  • 如果使用Python 3.12+,优先使用itertools.batched

考虑填充问题

如果需要对最后一个块进行填充,可以使用zip_longest或自定义填充逻辑。

常见问题

最后一个块长度不一致

许多方法会导致最后一个块的长度与其他块不同。可以根据具体需求选择是否对最后一个块进行填充。

性能问题

不同的实现方法在性能上可能会有差异。可以通过性能测试选择最合适的方法。例如:

1
2
3
4
5
import time
batch_size = 7
arr_len = 298937

# 测试不同方法的性能

总之,根据具体的需求和场景,选择合适的方法将列表分割成大小均匀的块。


如何将列表分割成大小均匀的块
https://119291.xyz/posts/2025-05-12.how-to-split-a-list-into-equally-sized-chunks/
作者
ww
发布于
2025年5月12日
许可协议