파이썬 groupby가 같은 키를 여러 그룹으로 나누는 이유

이 카테고리 글 목록

전체글 보기

흩어진 같은 분류를 한 그룹씩 모으려면 먼저 분류 키로 정렬한 뒤, 같은 키로 itertools.groupby()를 호출하세요. groupby()는 입력에서 같은 키가 이어지는 동안만 한 그룹으로 묶습니다. 아래처럼 작은 목록을 먼저 정렬하면 중간에 떨어져 있던 두 A가 나란히 놓입니다.

from itertools import groupby
from operator import itemgetter

rows = [("A", "pencil"), ("B", "tape"), ("A", "clip")]
by_category = itemgetter(0)
ordered = sorted(rows, key=by_category)

for category, group in groupby(ordered, key=by_category):
    print(category, list(group))
A [('A', 'pencil'), ('A', 'clip')]
B [('B', 'tape')]

itemgetter(0)은 각 행의 첫 값인 분류를 꺼냅니다. 이 함수를 정렬과 그룹화에 함께 쓰면, 정렬에서 이웃하게 만든 기준으로 그룹의 경계도 정할 수 있습니다. 그룹의 값이 필요하면 예제처럼 다음 그룹으로 넘어가기 전에 list(group)로 받으세요. 그룹 이터레이터는 바깥 groupby()와 같은 입력을 읽어서, 바깥쪽을 다음 그룹으로 진행한 뒤에는 이전 그룹의 남은 값을 읽을 수 없습니다.

연속 구간을 찾는다면 입력 순서를 유지하기

시간순 상태 기록에서 상태가 바뀐 지점을 찾을 때는 떨어져 있는 두 A도 서로 다른 구간입니다. 아래 가상 기록은 주어진 시간 순서 그대로 그룹화합니다.

from itertools import groupby

states = ["A", "B", "A"]
for state, group in groupby(states):
    print(state, list(group))
A ['A']
B ['B']
A ['A']

첫 A 뒤에 B가 나오면 첫 그룹이 끝납니다. 다음 A가 나오면 새 그룹이 시작됩니다. 이 경우 상태로 정렬하면 찾으려던 시간순 경계가 사라집니다.

가상 목록과 상태 기록은 Windows의 Python 3.14.3에서 실행했습니다. 연속 키와 그룹 이터레이터의 동작은 Python의 itertools.groupby 문서를 참고하세요.

이 카테고리의 다른 글

전체글 보기

댓글 남기기