파이썬에서 하나의 리스트를 지정한 길이 단위로 여러 개의 하위 리스트로 나누어야 할 때가 있습니다. 이럴 때 리스트 컴프리헨션(list comprehension)과 함께 iter 메서드, 그리고 itertools 모듈의 islice 메서드를 활용하면 아주 간결하게 처리할 수 있습니다.
예제 코드
아래는 실제 동작 과정을 보여주는 예제입니다.
from itertools import islice
my_list = [11, 22, 33, 34, 45, 26, 87, 11]
print("The list is :")
print(my_list)
length_to_split = [2, 5, 3]
print("The split length list is :")
print(length_to_split)
temp = iter(my_list)
my_result = [list(islice(temp, element)) for element in length_to_split]
print("The result is :")
print(my_result)
실행 결과
The list is : [11, 22, 33, 34, 45, 26, 87, 11] The split length list is : [2, 5, 3] The result is : [[11, 22], [33, 34, 45, 26, 87], [11]]
코드 설명
itertools 모듈에서
islice를 임포트하여 필요한 기능을 준비합니다.정수로 이루어진 원본 리스트를 정의하고 콘솔에 출력합니다.
분할할 길이 정보를 담고 있는 또 다른 정수 리스트를 정의하고 콘솔에 출력합니다.
원본 리스트에
iter메서드를 호출해 반복자(iterator)를 생성한 뒤 변수에 할당합니다.리스트 컴프리헨션으로 분할 길이 리스트의 요소를 하나씩 순회하며,
islice를 사용해 해당 길이만큼 요소를 잘라냅니다.잘라낸 결과를 리스트로 변환하여 새로운 변수에 저장합니다.
최종 분할 결과가 콘솔에 출력됩니다.
동작 원리
여기서 핵심은 islice가 반복자의 현재 위치부터 지정한 개수만큼만 소비한다는 점입니다. 따라서 첫 번째 호출에서 앞의 2개 요소([11, 22])를 가져간 후, 두 번째 호출에서는 그다음 위치인 33부터 5개 요소([33, 34, 45, 26, 87])를, 마지막에는 남은 1개 요소([11])를 가져오게 됩니다. 이처럼 반복자의 상태가 연속적으로 유지되기 때문에 별도의 인덱스 계산 없이도 깔끔하게 리스트를 분할할 수 있습니다.