2013-02-14 2 views
2

groupby 개의 결과를 쌍으로 반복 처리하려면 어떻게해야합니까? 내가 노력하는 것은 매우 작동되지 않습니다 :itertools.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)] 

답변

2
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 만 목록으로 바꿉니다.

+0

귀하의 편집 : 아주 사악한 즉 보통 : – root

2

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)] 
+0

로 계몽 – root