[英]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.