Python生成器,将另一个可迭代组合成N组

BCS*_*BCS 18 python generator std

我正在寻找一个可迭代i和大小的函数,n并产生长度n为连续值的元组i:

x = [1,2,3,4,5,6,7,8,9,0]
[z for z in TheFunc(x,3)]
Run Code Online (Sandbox Code Playgroud)

[(1,2,3),(4,5,6),(7,8,9),(0)]
Run Code Online (Sandbox Code Playgroud)

标准库中是否存在这样的功能?

如果它作为标准库的一部分存在,我似乎无法找到它并且我已经没有用于搜索的术语.我可以自己写,但我宁愿不写.

unu*_*tbu 21

如果要在n 使用填充值填充最终组的情况下将迭代器分组,请使用iter(lambda: list(IT.islice(iterable, n)), []):

import itertools as IT

def grouper(n, iterable):
    """
    >>> list(grouper(3, 'ABCDEFG'))
    [['A', 'B', 'C'], ['D', 'E', 'F'], ['G']]
    """
    iterable = iter(iterable)
    return iter(lambda: list(IT.islice(iterable, n)), [])

seq = [1,2,3,4,5,6,7]
print(list(grouper(3, seq)))
Run Code Online (Sandbox Code Playgroud)

产量

[[1, 2, 3], [4, 5, 6], [7]]
Run Code Online (Sandbox Code Playgroud)

这个答案的后半部分有一个解释它是如何工作的.


当你想组中的块的迭代器n 和垫最后一组与填充值,使用石斑鱼食谱 zip_longest(*[iterator]*n):

例如,在Python2中:

>>> list(IT.izip_longest(*[iter(seq)]*3, fillvalue='x'))
[(1, 2, 3), (4, 5, 6), (7, 'x', 'x')]
Run Code Online (Sandbox Code Playgroud)

在Python3中,izip_longest现在改名为zip_longest:

>>> list(IT.zip_longest(*[iter(seq)]*3, fillvalue='x'))
[(1, 2, 3), (4, 5, 6), (7, 'x', 'x')]
Run Code Online (Sandbox Code Playgroud)

如果要按顺序序列进行分组,n可以使用以下chunks配方:

def chunks(seq, n):
    # https://stackoverflow.com/a/312464/190597 (Ned Batchelder)
    """ Yield successive n-sized chunks from seq."""
    for i in xrange(0, len(seq), n):
        yield seq[i:i + n]
Run Code Online (Sandbox Code Playgroud)

请注意,与通常的迭代器不同,序列按定义具有长度(即__len__定义).


And*_*ffe 19

请参阅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)
Run Code Online (Sandbox Code Playgroud)

(但是,这是很多问题的重复.)

  • 如果我知道要搜寻"石斑鱼",我根本不需要问.但我不知道那个词. (2认同)
  • 我最终使用了这个,但不得不在稍后阶段过滤掉填充值. (2认同)