2017-04-17 3 views
1

itertools.groupby의 결과를 값 목록으로 디코딩하려고합니다.파이썬 목록 이해가 itertools.groupby 디코딩을 위해 작동하지 않습니다

내 소스는 다음과 같습니다

x = [(1, 2), (2, 1), (6, 3), (6, 5), (1, 3)] 

원래 방법은 다음과 같이 진술에 대한 함께 할 것입니다 동안 : 나는대로 한 줄에 그것을 만들 지능형리스트를 사용을 선택

keyfunc = itemgetter(0) 
groups = [] 
uniquekeys = [] 
data = sorted(x, key=keyfunc) 
for k, g in itertools.groupby(data, keyfunc): 
    groups.append(list(g))  # Store group iterator as a list 
    uniquekeys.append(k) 

을 :

[(k, list(g)) for k, g in list(itertools.groupby(x, keyfunc))] 

첫 번째 방법의 결과는 다음

[1, 2, 6] #for uniquekeys 
[[(1, 2), (1, 3)], [(2, 1)], [(6, 3), (6, 5)]] #for groups 

완전히 의미가 있습니다.

두 번째 방법의 결과는 우리가 그룹이 비어 있거나 하나의 정수를 보유 중입니다 볼 수 있습니다

[(1, []), (2, []), (6, [(6, 5)])] 

.

어디서 잘못 되었나요?

+2

itertools.groupby (x, keyfunc)]에서'[(k, list (g))를 k에 사용하십시오] ' –

+0

Thanks @ThierryLathuille, Works! –

+1

@ThierryLathuille 왜 그것이 변화를 가져 오나요? –

답변

1

문제는 list(itertools.groupby(x, keyfunc))에있는 목록입니다. 그냥 떨어 뜨리면 효과가 있습니다.

list(itertools...에는 예제에 네 개의 반복자가 있으며 모두 동일한 기본 반복기를 공유합니다. 목록을 구성함으로써 처음 세 반복자를 효과적으로 소모하여 네 번째 반복자를 작성하여 모든 것을 사용할 수 없게 만들었습니다. 명시 적 목록을 삭제하면 iterator에서 iterator로 이동합니다.

+0

라고 울부 짖습니다. 고맙습니다. –