令我惊讶的是,我找不到一个“批处理”函数,该函数会将可迭代对象作为输入并返回可迭代对象的可迭代对象。
例如:
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本身中运行此行为时,才会发生上述行为]
这可能更有效(更快)
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]
它避免建立新列表。