【发布时间】:2026-02-08 15:45:02
【问题描述】:
我遇到two different ways 将iterable 拆分为“块”(超过一项)。
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return izip_longest(*args, fillvalue=fillvalue)
the other method is straight python:
def chunker(seq, size):
return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))
itertools 实现会为您购买任何“额外”的东西吗?
“额外”在哪里,可能更快、更灵活或更安全。
我问是因为这里显示的 itertools 实现绝对不是 IMO 更具可读性/直观性。
【问题讨论】:
-
我同意可迭代方法看起来有点神奇,但它也可以以更易读的方式实现。迭代器和切片这两种方法都可以用多种方式编写,因此可读性并不是真正的考虑因素 imo
-
您也可以使用:
def chunker(iterable, size): yield from iter(lambda it=iter(iterable): list(islice(it, size)), [])... -
@unutbu 是的,并且在
yield from之前也能很好地工作......唯一明显的区别是inspect.isgenerator对iter失败......但是耸耸肩 ... 6 个半打等等... -
@Felk 我认为“magic-y”是一种委婉说法。通过乘数引用滥用列表初始化的文档:“它们被多次引用。这经常困扰新的 Python 程序员”。这其中的坏处是几乎相同的
[iter(iterable) for _ in range(n)]具有不同的效果。
标签: python itertools readability