如何从可迭代对象中一次生成多个对象?

4 投票
2 回答
6853 浏览
提问于 2025-04-15 18:54

我怎样才能一次从一个可迭代的对象中返回多个项目呢?

比如说,假设我有一个长度不固定的序列,我想要每次循环的时候,按X个连续的项目来处理这些序列中的内容,应该怎么做呢?

2 个回答

2

这里有另一种方法,适用于旧版本的Python,这些版本没有izip_longest这个功能:

def grouper(n, seq):
  result = []
  for x in seq:
    result.append(x)
    if len(result) >= n:
      yield tuple(result)
      del result[:]
  if result:
    yield tuple(result)

没有填充,所以最后一组可能会少于n个元素。

7

你的问题有点模糊,不过可以看看 itertools 文档里的 grouper 这个例子。

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

[iter(iterable)]*n 这个老方法多次压缩同一个迭代器是个老把戏,但把它封装成这个函数可以避免让代码变得复杂,而且它的形式和接口跟很多人会用的一样。这是一个比较常见的需求,没想到它居然不在 itertools 模块里,真有点可惜。

撰写回答