2018년 1월 2일 화요일

Python Itertools 의 groupby 함수

파이썬 기본 라이브러리인 itertools 안에 가장 요긴한 함수를  하나를 꼽으라면,
전 이걸 뽑습니다.

사용법은 간단하면서도 오묘합니다.

....
from itertools import groupby
import pprint

d = [('Europe','Manchester'),
     ('America','NewYork'),
     ('Asia','Seoul'),
     ('Asia','Tokyo'),
     ('America','Chicago'),
     ('America','Seattle'),
     ('Europe','London'),
     ('Asia','Beijing'),
     ('Europe','Paris'),
     ]

category = {}
for k, g in groupby(sorted(d), lambda x:x[0]):
  listg =[x[1] for x in list(g)] 
  category[k] = listg


pprint.pprint ( category)

'''
{'America': ['Chicago', 'NewYork', 'Seattle'],
 'Asia': ['Beijing', 'Seoul', 'Tokyo'],
 'Europe': ['London', 'Manchester', 'Paris']}
'''

key, group으로 분류를 해줘서  알아서 분류를 다 해서 list로 갖다 바칩니다.
기준을 삼을것을 위 예제에서는 lambda로 구현했지만, 이 부분은 함수가 들어가도 됩니다.
(사용자 정의 분류함수등이 있으면 좋겠네요)

아래는 또다른 예시입니다.
캐릭터 모음이 있는데 이중 직업을 가지고 분류한 예시입니다.



몇줄 되지는 않지만, 그냥 구현 할려면 은근히 귀찮은 부분이 많은 부분을
groupby 하나면, 알아서 분류를 척척척 해주니깐 고맙기짝이 없습니다.

이게 처음에는 좀 익숙하지 않은 부분이 있는데,
익숙해지면 굉장히 라인수를 줄여주는 function중의 하나입니다.

주의할점은 groupby들어가기전에 정렬할 function을 sorting을 한번 해줘야합니다.
그렇지 않으면, group이 여러 개가 생겨서 합치는 작업을 또 해야 되는 점이 있습니다.
하지만, 이걸 파이썬에서 채용하면서 굉장히 유용하게 잘 쓰고 있습니다.

기본 라이브러리이지만,
Pandas에서도 비슷한 기능을 동일한 이름으로 지원하고 있습니다.

다음에는 그 부분에 대해서 적어봐야겠습니다.






댓글 없음:

댓글 쓰기