从可迭代对象一次产生多个对象?

时间:2010-02-04 19:12:20

标签: python iterator grouping yield

如何从可迭代对象一次产生多个项目?

例如,对于任意长度的序列,如何在每次迭代的X个连续项的组中迭代序列中的项?

2 个答案:

答案 0 :(得分:7)

您的问题有点模糊,但请查看grouper文档中的itertools食谱。

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模块中,这有点遗憾。)

答案 1 :(得分:2)

这是另一种适用于没有izip_longest的旧版Python的方法:

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个元素。