为了账号安全,请及时绑定邮箱和手机立即绑定

在Python中用块(n)迭代迭代器?

在Python中用块(n)迭代迭代器?

慕田峪7331174 2019-08-08 10:44:38
在Python中用块(n)迭代迭代器?你能想出一个很好的方法(可能用itertools)将迭代器拆分成给定大小的块吗?因此l=[1,2,3,4,5,6,7]与chunks(l,3)变成一个迭代[1,2,3], [4,5,6], [7]我可以想到一个小程序来做这个,但不是一个很好的方式可能是itertools。
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超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)

不过,它会用填充值填充最后一个块。

一种不太通用的解决方案,仅适用于序列,但可以根据需要处理最后一个块

[my_list[i:i + chunk_size] for i in range(0, len(my_list), chunk_size)]

最后,对一般迭代器起作用的解决方案的行为符合要求

def grouper(n, iterable):
    it = iter(iterable)
    while True:
       chunk = tuple(itertools.islice(it, n))
       if not chunk:
           return
       yield chunk


查看完整回答
反对 回复 2019-08-08
?
森林海

TA贡献2011条经验 获得超2个赞

这适用于任何可迭代的。它返回发电机的发电机(充分灵活)。我现在意识到它与@reclosedevs解决方案基本相同,但没有绒毛。无需try...exceptStopIteration传播了起来,这是我们想要的。

next(iterable)需要调用,以提高StopIteration当迭代是空的,因为islice将永远继续下去产卵空的发电机,如果你让它。

它更好,因为它只有两行,但很容易理解。

def grouper(iterable, n):
    while True:
        yield itertools.chain((next(iterable),), itertools.islice(iterable, n-1))

请注意,它next(iterable)被放入元组中。否则,如果next(iterable)它本身是可迭代的,那么itertools.chain就会把它弄平。感谢Jeremy Brown指出这个问题。


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 471 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号