배경
회사에서 이슈를 처리 하다가, 키 값을 기준으로 하위 리스트를 처리할 일이 있었다.
자바였으면 groupingBy()
를 이용하여 쉽게 처리를 할 수 있다는 생각을 하고 있었던 참에 파이썬도 이와같은 함수를 지원하지 않을까라는 생각이 들어서 검색을 해보니 비슷한 함수가 있었다.
- 연속된 키와 그룹을 반환하는 이터레이터를 만든다.
- 인자중에, 키는 각 요소의 키 값을 계산하는 함수이다.
- 일반적으로 해당 항목은 동일한 키 함수에 대해서 이미 정렬되어야 한다.
- 키 함수의 값이 변경될 때마다 중단하거나 새 그룹을 생성하기 때문에 동일한 키 함수를 이용하여 데이터를 정렬해줘야한다.
- 그렇기 때문에 입력 순서에 관계없이 공통 요소를 집계하는 SQL의 GROUP BY와는 다르다.
- 이터레이터가 진행될 때마다, 이전 그룹은 사라지므로 만약 필요하다면 리스트로 저장해야한다.
아래는 groupby
를 사용한 예제이다.
from itertools import groupby
things = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]
for key, group in groupby(things, lambda x: x[0]):
for thing in group:
print("A %s is a %s." % (thing[1], key))
print("")
키 값으로 튜플의 첫 번째 값을 사용하여 정렬 하였고, 키 값에 따른 그룹이 생성될 때마다 이를 출력한 것이다.
주의할 점
- 앞에서 말했듯이 사용하기 전에, 키 값을 기준으로 정렬이 된 리스트인지, 그리고 보장을 하지 못한다면 정렬을 해줘야하는 것을 알 수 있다.
# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
정렬을 해주지 않으면 위와 같은 형태로 만들어 지게 된다.