以块的形式迭代迭代器
考虑一个场景,您拥有一个迭代器 l = [1, 2, 3, 4, 5, 6 , 7] 并希望将其划分为大小为 3 的块,从而产生一个包含 [[1, 2, 3], [4, 5, 6], [7]].
itertools 解决方案
Python 标准库在 itertools 模块中提供了一个方便的解决方案:
import itertools def grouper(iterable, n, *, incomplete='fill', fillvalue=None): """Collect data into non-overlapping fixed-length chunks or blocks.""" args = [iter(iterable)] * n if incomplete == 'fill': return zip_longest(*args, fillvalue=fillvalue) elif incomplete == 'strict': return zip(*args, strict=True) elif incomplete == 'ignore': return zip(*args) else: raise ValueError('Expected fill, strict, or ignore') chunks = list(grouper(l, 3)) # Output: [[1, 2, 3], [4, 5, 6], [7]]
标准库增强版本
在 itertools 配方的最新版本中引入的批处理专用函数,精确地满足了这种分块要求:
from itertools import batched chunks = list(batched(l, 3)) # Output: [[1, 2, 3], [4, 5, 6], [7]]
非通用解决方案
特别是对于序列,一种更简单的方法可以有效地处理最后的块是:
chunks = [my_list[i:i + chunk_size] for i in range(0, len(my_list), chunk_size)]
以上是如何在 Python 中有效地对迭代器进行分块?的详细内容。更多信息请关注PHP中文网其他相关文章!