一尘不染

如何在恒定大小的块中拆分可迭代

algorithm

令我惊讶的是,我找不到一个“批处理”函数,该函数会将可迭代对象作为输入并返回可迭代对象的可迭代对象。

例如:

for i in batch(range(0,10), 1): print i
[0]
[1]
...
[9]

要么:

for i in batch(range(0,10), 3): print i
[0,1,2]
[3,4,5]
[6,7,8]
[9]

现在,我写了我认为很简单的生成器:

def batch(iterable, n = 1):
   current_batch = []
   for item in iterable:
       current_batch.append(item)
       if len(current_batch) == n:
           yield current_batch
           current_batch = []
   if current_batch:
       yield current_batch

但是以上这些并没有给我我所期望的:

for x in   batch(range(0,10),3): print x
[0]
[0, 1]
[0, 1, 2]
[3]
[3, 4]
[3, 4, 5]
[6]
[6, 7]
[6, 7, 8]
[9]

所以,我错过了一些东西,这可能表明我完全不了解python生成器。有人愿意指出我正确的方向吗?

[编辑:我最终意识到,只有当我在ipython而不是python本身中运行此行为时,才会发生上述行为]


阅读 274

收藏
2020-07-28

共1个答案

一尘不染

这可能更有效(更快)

def batch(iterable, n=1):
    l = len(iterable)
    for ndx in range(0, l, n):
        yield iterable[ndx:min(ndx + n, l)]

for x in batch(range(0, 10), 3):
    print x

使用清单范例

data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # list of data

for x in batch(data, 3):
    print(x)

# Output

[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9, 10]

它避免建立新列表。

2020-07-28