【发布时间】:2012-01-07 14:10:33
【问题描述】:
可能重复:
How do you split a list into evenly sized chunks in Python?
我很惊讶我找不到将可迭代作为输入并返回可迭代的可迭代的“批处理”函数。
例如:
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 本身时才会发生上述行为]
【问题讨论】:
-
好问题,写得很好,但它已经存在并且会解决你的问题。
-
IMO 这不是真正的重复。另一个问题侧重于列表而不是迭代器,并且大多数答案都需要 len() ,这对于迭代器来说是不可取的。但是呃,这里目前接受的答案也需要len(),所以...
-
这显然不是重复的。另一个问答仅适用于列表,这个问题是关于泛化到所有可迭代的,这正是我来这里时想到的问题。
-
@JoshSmeaton @casperOne 这不是重复的,接受的答案不正确。链接的重复问题是针对列表的,这是针对可迭代的。 list 提供 len() 方法,但 iterable 不提供 len() 方法,如果不使用 len() 答案会有所不同 这是正确答案:
batch = (tuple(filterfalse(lambda x: x is None, group)) for group in zip_longest(fillvalue=None, *[iter(iterable)] * n)) -
@TrideepRath 是的,我已经投票决定重新开放。
标签: python algorithm generator chunking