2012-12-14 3 views
32

나는 itertools와 함께 일하고 있으며 groupby를 사용하여 마지막 요소로 묶음을 정렬합니다. 나는 그것을 분류하고 그룹을 순조롭게 반복 할 수는 있지만, 카운터를 증가시키면서 각 그룹을 반복하지 않고도 각 그룹의 길이를 얻을 수 있기를 정말로 원합니다.Python : itertools의 길이를 얻는 방법 _grouper

프로젝트는 일부 데이터 요소를 클러스터링합니다. 나는 쌍 함께 일하고 있어요 (numpy.array, INT)을 NumPy와 배열은 데이터 포인트이며, 정수 클러스터 라벨

여기 내 관련 코드입니다입니다 : 마지막 줄에

data = sorted(data, key=lambda (point, cluster):cluster) 
for cluster,clusterList in itertools.groupby(data, key=lambda (point, cluster):cluster): 
    if len(clusterList) < minLen: 

는, 'len (clusterList) < minLen :', 'itertools._grouper'유형의 객체에 len()이 없다는 오류가 발생합니다.

_groupers에서 사용할 수있는 작업을 찾았지만 그룹 길이를 제공하는 것으로 보이는 항목을 찾을 수 없습니다.

+0

더 좋은 방법이있을 수 있지만 iterable을 목록으로 변환하고 요소를 계산할 수 있습니다 ('if len (list (clusterList)) RocketDonkey

+0

고마워요, RocketDonkey, 완벽하게 작동합니다! – user1466679

+0

전혀 문제가 없습니다 - 아래의 답변은 동일한 수정을 제안하므로 사용자는 그 중 하나를 '대답'으로 받아 들일 수 있습니다. 모든 것에 행운을 빈다. – RocketDonkey

답변

38

그냥 전화하기 때문에 clusterList은 목록에 포함되지 않습니다! 기본적으로 게으른 반복자로 각 항목을 필요한대로 반환합니다.

clusterList = list(clusterList) 

또는 그렇게 한 단계로 길이를 얻을 : 당신은하지만, 이런리스트로 변환 할 수 있습니다

length = len(list(clusterList)) 

당신이 만드는 메모리를 차지하지 않으려면 이 목록 대신이 작업을 수행 할 수 있습니다

length = sum(1 for x in clusterList) 

은 원래의 반복자가 하나가 목록으로 변환하거나 sum() 공식을 사용하여 완전히 소모된다는 점에 유의해야합니다.

1

clusterListiterable이지만 list이 아닙니다. 때때로 약간 혼란 스러울 수 있습니다. clusterList 이상의 for 루프를 수행 할 수 있지만 그 위에 다른 목록 작업 (슬라이스, len 등)을 수행 할 수는 없습니다.

수정 : list(clusterList)의 결과를 clusterList에 할당합니다.

관련 문제