리스트에서 요소들이 연속으로 나타나는 인덱스 범위를 그룹별로 묶어야 하는 경우가 있습니다. 이럴 때 defaultdict를 활용하면 깔끔하게 해결할 수 있습니다. 간단한 반복문과 함께 itertools의 groupby 메서드, 그리고 len, list, append 메서드를 조합하여 구현할 수 있습니다.
동작 원리
groupby는 인접한 동일한 요소들을 하나의 그룹으로 묶어주는 함수입니다. 각 그룹의 길이를 계산하고, 현재 인덱스 위치부터 그룹 길이만큼 떨어진 끝 인덱스까지의 튜플을 결과 딕셔너리에 저장하는 방식으로 동작합니다.
예제 코드
아래는 실제 구현 예시입니다.
from itertools import groupby
from collections import defaultdict
my_list = [63, 12, 84, 91, 52, 39, 25, 27, 20, 11, 0, 9]
print("리스트 : ")
print(my_list)
my_index = 0
my_result = defaultdict(list)
for key, sub in groupby(my_list):
element = len(list(sub))
my_result[key].append((my_index, my_index + element - 1))
my_index += element
print("결과 딕셔너리 : ")
print(my_result)실행 결과
리스트 :
[63, 12, 84, 91, 52, 39, 25, 27, 20, 11, 0, 9]
결과 딕셔너리 :
defaultdict(<class 'list'>, {63: [(0, 0)], 12: [(1, 1)], 84: [(2, 2)], 91: [(3, 3)], 52: [(4, 4)], 39: [(5, 5)], 25: [(6, 6)], 27: [(7, 7)], 20: [(8, 8)], 11: [(9, 9)], 0: [(10, 10)], 9: [(11, 11)]})코드 설명
groupby와defaultdict에 필요한 패키지를 환경에 임포트합니다.정수로 이루어진 리스트를 정의하고 콘솔에 출력합니다.
인덱스 추적을 위한 변수를 0으로 초기화합니다.
결과를 저장할 기본 딕셔너리(defaultdict)를 생성합니다.
리스트에
groupby메서드를 적용하며 순회합니다.각 그룹의 시작 인덱스와 끝 인덱스를 튜플 형태로 빈 딕셔너리에 추가(append)합니다.
그룹의 길이만큼 인덱스 값을 증가시켜 다음 그룹의 시작 위치를 갱신합니다.
최종 결과를 콘솔에 출력합니다.
활용 예시
예를 들어 리스트에 중복된 연속 요소가 있는 경우 [1, 1, 1, 2, 2, 3]처럼 같은 값이 이어질 때, 이 방법을 사용하면 {1: [(0, 2)], 2: [(3, 4)], 3: [(5, 5)]}와 같이 각 값이 어느 인덱스 범위에 걸쳐 있는지 한눈에 파악할 수 있습니다. 데이터 분석이나 로그 처리 시 유용하게 활용됩니다.