2014-03-28 2 views
0

먼저, 문제에 대한 나의 잘못된 설명에 대해 사과드립니다. 나는 더 나은 것을 찾을 수 없다.groupby 결과를 일찍 깨달을 때 Python에서 itertools.groupby의 기이함

itertools.groupby 결과에 목록을 적용하면 결과가 삭제된다는 것을 알았습니다. 코드를 참조하십시오

import itertools 
import operator 

log = '''\ 
hello world 
hello there 
hi guys 
hi girls'''.split('\n') 

data = [line.split() for line in log] 

grouped = list(itertools.groupby(data, operator.itemgetter(0))) 

for key, group in grouped: 
    print key, group, list(group) 

print '-'*80 

grouped = itertools.groupby(data, operator.itemgetter(0)) 

for key, group in grouped: 
    print key, group, list(group) 

결과는 다음과 같습니다 아마이는 GROUPBY 함수의 내부 작업과 관련이

hello <itertools._grouper object at 0x01A86050> [] 
hi <itertools._grouper object at 0x01A86070> [['hi', 'girls']] 
-------------------------------------------------------------------------------- 
<itertools.groupby object at 0x01A824E0> 
hello <itertools._grouper object at 0x01A860B0> [['hello', 'world'], ['hello', 'there']] 
hi <itertools._grouper object at 0x01A7DFF0> [['hi', 'guys'], ['hi', 'girls']] 

. 그럼에도 불구하고 그것은 오늘 나를 놀라게했다.

답변

4

documented입니다 :

반환 그룹 groupby()으로 반복 가능한 근본적인를 공유 반복자 자체입니다. 원본이 공유되어 있기 때문에 groupby() 개체를 고급 상태로 만들면 이전 그룹이 더 이상 표시되지 않습니다.

list(groupby(...))을 수행하면 groupby 개체가 끝까지 진행되며 마지막 그룹을 제외한 모든 그룹이 손실됩니다. 그룹을 저장해야하는 경우 문서에 표시된대로 수행하고 groupby 객체를 반복하는 동안 각각을 저장하십시오. [(key,[group])]를 그 원하는 무엇 인 경우 그룹의 키 튜플과리스트의 목록에 반복자를 바꾸는

list((key, list(group)) for key, group in itertools.groupby(...)) 

:

1

문서의 예제처럼 좋은하지 않습니다.

+0

원하는 경우 'list'를 사용할 필요가 없습니다. 목록 이해를 직접 사용하면됩니다 : itertools.groupby (...)]의 키에 대해 [(key, list (group) – BrenBarn

+0

@BrenBarn 하나는 파이썬 2와 3 모두에서 똑같은 동작을하지 않을 수 있습니다. 파이썬 2에서는 생성자 표현식에서 볼 수없는 변수가 누설됩니다. 이것은 파이썬 3에서 수정되었지만, 이렇게함으로써'list() '에 비해'[]'를 사용하는 속도가 빨라졌습니다. 또한 단순히'list'를'dict'으로 대체 할 수없고 대신'{key : [group]}'을 얻을 수 있습니다. –