2011-11-14 2 views
5

내가이 데이터를 가지고 : 내가 얻을 list(group)에 대한itertools.groupby는()

for mid, group in itertools.groupby(self.data, key=operator.itemgetter(0)): 

: :이 코드를 실행하면

self.data = list: [(1, 1, 5.0), 
        (1, 2, 3.0), 
        (1, 3, 4.0), 
        (2, 1, 4.0), 
        (2, 2, 2.0), 
        (2, 3, 4.0), 
        (2, 5, 3.0), 
        (3, 2, 2.0), 
        (3, 4, 4.0), 
        (3, 5, 3.0)] 

list: [(1, 1, 5.0), 
     (1, 2, 3.0), 
     (1, 3, 4.0)] 

내가 원하는이다 . 나는 튜플의 두 번째 번호로 그룹에 대신 0

for mid, group in itertools.groupby(self.data, key=operator.itemgetter(1)): 

의 1을 사용한다면, 나는 단지

를 얻을 :

list: [(1, 1, 5.0)] 

"이 한 다른 튜플이있다하더라도 "그 1 (2) 위치.

답변

12

itertools.groupby은 동일한 키를 사용하여 인접한 항목을 함께 수집합니다. 같은 키를 가진 모든 항목을 원하면 self.data을 먼저 정렬해야합니다.

for mid, group in itertools.groupby(
    sorted(self.data,key=operator.itemgetter(1)), key=operator.itemgetter(1)): 
+0

이전에 위치 0을 정렬했습니다. 그래서 groupby를하기 전에 다시 정렬했습니다. self.data.sort (key = operator.itemgetter (1)) – user994165

10

분류가없는 변형 (사전을 통해). 성능면에서 더 우수해야합니다.

def full_group_by(l, key=lambda x: x): 
    d = defaultdict(list) 
    for item in l: 
     d[key(item)].append(item) 
    return d.items() 
+0

똑같은 것을 게시하기 위해 돌아 왔지만 답을 읽지 못했습니다! 이것은 분명히가는 방법입니다 :) –