중첩 리스트(nested list)에서 각 하위 리스트가 시작되는 인덱스를 구해야 하는 경우, 간단한 반복문과 append 메서드를 활용하면 손쉽게 해결할 수 있습니다.
이 방법은 각 하위 리스트의 길이를 누적하여 다음 하위 리스트가 시작되는 위치(인덱스)를 계산하는 원리로 동작합니다.
예제 코드
아래는 실제 동작을 보여주는 예제입니다.
my_list = [[51], [91, 22, 36, 44], [25, 25], [46, 67, 78, 82, 69, 29], [7, 5]]
print("리스트 출력 :")
print(my_list)
my_result = []
my_len = 0
for sub in my_list:
my_result.append(my_len)
my_len += len(sub)
print("각 시작 요소의 인덱스 :")
print(my_result)실행 결과
리스트 출력 : [[51], [91, 22, 36, 44], [25, 25], [46, 67, 78, 82, 69, 29], [7, 5]] 각 시작 요소의 인덱스 : [0, 1, 5, 7, 13]
코드 설명
- 리스트 안에 여러 개의 리스트가 포함된 중첩 리스트를 정의하고, 콘솔에 출력합니다.
- 결과를 저장할 빈 리스트를 하나 만들고, 인덱스 계산용 변수를 0으로 초기화합니다.
- 반복문으로 중첩 리스트를 순회하면서 현재까지 누적된 인덱스 값을 빈 리스트에 추가(
append)합니다. - 순회할 때마다 해당 하위 리스트의 요소 개수만큼 인덱스 변수를 증가시켜, 다음 하위 리스트의 시작 위치를 계산합니다.
- 모든 순회가 끝나면 채워진 결과 리스트가 곧 각 하위 리스트의 시작 인덱스 목록이 됩니다.
- 최종 결과를 콘솔에 출력합니다.
대안 방법: itertools.accumulate 활용
파이썬 표준 라이브러리인 itertools의 accumulate 함수를 사용하면 더 간결하게 표현할 수도 있습니다.
from itertools import accumulate my_list = [[51], [91, 22, 36, 44], [25, 25], [46, 67, 78, 82, 69, 29], [7, 5]] my_result = [0] + list(accumulate(len(sub) for sub in my_list[:-1])) print(my_result) # [0, 1, 5, 7, 13]
두 방법 모두 시간 복잡도는 O(N)(N은 전체 요소 수)으로 효율적이며, 상황에 맞게 선택하여 사용하면 됩니다.