簡體   English   中英

itertools.groupby:成對迭代組

[英]itertools.groupby: iterate over groups pairwise

如何成對訪問groupby結果? 我嘗試的不是很有效:

from itertools import groupby,izip

groups = groupby([(1,2,3),(1,2),(1,2),(3,4,5),(3,4)],key=len)

def grouped(iterable, n):    
    return izip(*[iterable]*n)

for g, gg in grouped(groups,2):
    print list(g[1]), list(gg[1])

我得到的輸出:

[] [(1, 2), (1, 2)]
[] [(3, 4)]

我想要的輸出:

[(1, 2, 3)] [(1, 2), (1, 2)]
[(3, 4, 5)] [(3, 4)]
import itertools as IT

groups = IT.groupby([(1,2,3),(1,2),(1,2),(3,4,5),(3,4)], key=len)
groups = (list(group) for key, group in groups)

def grouped(iterable, n):
    return IT.izip(*[iterable]*n)

for p1, p2  in grouped(groups, 2):
    print p1, p2

產量

[(1, 2, 3)] [(1, 2), (1, 2)]
[(3, 4, 5)] [(3, 4)]

您發布的代碼非常有趣。 它有一個普通的問題,還有一個微妙的問題。

普通的問題是itertools.groupby返回一個迭代器,該迭代器在每次迭代時都輸出鍵和組。 由於您只對組感興趣,而不對鍵感興趣,因此您需要

groups = (group for key, group in groups)

這個細微的問題很難解釋-我不確定我是否完全理解它。 這是我的猜測: groupby返回的迭代器已將其輸入轉為輸入,

[(1,2,3),(1,2),(1,2),(3,4,5),(3,4)]

進入迭代器。 將groupby迭代器包裝在基礎數據迭代器的周圍類似於將csv.reader纏繞在基礎文件對象迭代器的周圍。 您只能通過此迭代器獲得一次通過。 在將項目groups的過程中,itertools.izip函數使groups迭代器從第一個項目前進到第二個項目。 由於僅通過迭代器獲得一次通過,因此第一項已被消耗,因此在調用list(g[1])它為空。

解決此問題的方法 不太令人滿意 ,是將groups的迭代器轉換為列表:

groups = (list(group) for key, group in groups)

因此itertools.izip不會過早使用它們。 編輯:再三考慮,這個修復還不錯。 groups仍然是一個迭代,且僅接通group ,因為它被消耗到一個列表中。

當您嘗試查看來自groupby的第二個鍵時,您將強制其將其迭代到源迭代器中。 由於通常沒有地方可以存儲第一組中的項目,因此將其簡單地丟棄。

因此,現在我們了解了為什么在嘗試查看第二組的鍵(或項目)之前,需要確保已經存儲了第一組的項目。

有些人肯定會討厭這個,但是

>>> groups = groupby([(1, 2, 3), (1, 2), (1, 2), (3, 4, 5), (3, 4)], key=len)
>>> for i, j in ((list(i[1]), list(next(groups)[1])) for i in groups):
...     print i, j
... 
[(1, 2, 3)] [(1, 2), (1, 2)]
[(3, 4, 5)] [(3, 4)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM