데이터 분석 업무에서는 수집한 데이터를 요구 사항에 맞게 가공하고 재배치해야 하는 복잡한 상황이 자주 발생합니다. 이런 과정에서 하나의 큰 리스트를 여러 개의 하위 리스트로 나눠야 할 필요가 생기곤 하는데요. 이 글에서는 Python에서 리스트를 지정한 인덱스를 기준으로 분할하는 대표적인 두 가지 방법을 예제와 함께 살펴보겠습니다.
1. zip과 for 루프 활용하기
이 방식은 리스트 슬라이싱(slicing)을 이용해 분할이 시작되는 지점부터 요소를 가져온 뒤, zip 함수와 for 루프를 조합해 하위 리스트를 생성합니다. 핵심 아이디어는 분할 지점 목록 앞에 0을 추가하고 뒤에 None을 붙여 각 구간의 시작점과 끝점 쌍을 만드는 것입니다.
예제
Alist = ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4]
# 분할할 인덱스 지점
split_points = [2, 5, 8]
# 주어진 리스트
print("Given list : " + str(Alist))
# 분할 지점 출력
print("The points of splitting : ", split_points)
# 리스트 분할 수행
split_list = [Alist[i: j] for i, j in zip([0] +
split_points, split_points + [None])]
# 결과 출력
print("The split lists are : ", split_list)
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Given list : ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4] The points of splitting : [2, 5, 8] The split lists are : [['Mon', 'Tue'], ['Wed', 6, 7], ['Thu', 'Fri', 11], [21, 4]]
2. chain과 zip 활용하기
itertools 모듈의 chain 함수는 첫 번째 이터러블의 요소를 모두 소진할 때까지 차례로 반환한 후, 다음 이터러블로 넘어가는 이터레이터를 생성합니다. 이를 활용하면 분할 지점을 깔끔하게 표시할 수 있고, 이어서 zip 함수로 각 구간의 시작점과 끝점을 묶어 하위 리스트를 만들 수 있습니다.
예제
from itertools import chain
Alist = ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4]
# 분할할 인덱스 지점
split_points = [2, 5, 8]
# 주어진 리스트
print("Given list : ", str(Alist))
# 분할 지점 출력
print("The points of splitting : ", split_points)
# 사용자 지정 리스트 분할 수행
sublists = zip(chain([0], split_points), chain(split_points, [None]))
split_list = list(Alist[i : j] for i, j in sublists)
# 결과 출력
print("The split lists are : ", split_list)
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Given list : ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4] The points of splitting : [2, 5, 8] The split lists are : [['Mon', 'Tue'], ['Wed', 6, 7], ['Thu', 'Fri', 11], [21, 4]]
마무리
두 방법 모두 동일한 결과를 내지만, zip과 for 루프를 사용하는 첫 번째 방식은 리스트 컴프리헨션으로 간결하게 표현할 수 있고, chain을 활용하는 두 번째 방식은 itertools를 이용해 경계값을 더 유연하게 구성할 수 있다는 장점이 있습니다. 상황과 코드 스타일에 맞는 방법을 선택해 사용하시면 됩니다.