亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在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 關注
  • 470 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號