파이썬에서 리스트나 제너레이터처럼 반복 가능한(iterable) 객체에서 처음 N개 항목만 추출해야 하는 경우가 자주 있습니다. 다행히 파이썬은 이 작업을 아주 간단하게 처리할 수 있는 여러 가지 방법을 제공합니다. 이 글에서는 초보자도 쉽게 따라 할 수 있도록 대표적인 예제와 함께 정리해 보겠습니다.
1. 슬라이스 연산자로 리스트의 처음 N개 요소 가져오기
리스트, 튜플, 문자열 같은 시퀀스 자료형에는 기본적으로 슬라이스 연산자([])가 지원됩니다. 이 연산자를 활용하면 한 줄의 코드로 원하는 개수만큼의 요소를 손쉽게 가져올 수 있습니다.
numbers = [10, 20, 30, 40, 50, 60, 70]
first_five = numbers[:5]
print(first_five) # 출력: [10, 20, 30, 40, 50]
[:5]는 인덱스 0부터 시작해 5번째 요소 앞까지 잘라낸다는 의미입니다. 만약 N이 리스트의 전체 길이보다 크더라도 오류 없이 전체 요소가 반환되므로 안전하게 사용할 수 있습니다.
2. itertools.islice()로 제너레이터의 처음 N개 항목 가져오기
제너레이터는 지연 평가(lazy evaluation) 방식으로 동작하기 때문에 슬라이스 연산자를 직접 사용할 수 없습니다. 이럴 때는 표준 라이브러리의 itertools.islice() 함수를 사용하는 것이 가장 깔끔한 방법입니다.
from itertools import islice
def number_generator():
n = 1
while True:
yield n
n += 1
gen = number_generator()
first_five = list(islice(gen, 5))
print(first_five) # 출력: [1, 2, 3, 4, 5]
islice(gen, 5)는 무한히 값을 생성하는 제너레이터에서도 딱 5개의 값만 소비하고 멈추기 때문에 메모리를 낭비하지 않습니다. 특히 대용량 데이터 스트림이나 파일을 순차적으로 처리할 때 매우 유용합니다.
3. 반복문과 next()를 활용한 방법
외부 모듈 없이 순수 파이썬 문법만으로 처리하고 싶다면 next() 함수와 반복문을 조합할 수 있습니다.
gen = iter(range(100))
n = 5
result = [next(gen) for _ in range(n)]
print(result) # 출력: [0, 1, 2, 3, 4]
단, 이 방식은 제너레이터에 남은 요소가 N개보다 적으면 StopIteration 예외가 발생할 수 있으므로, 필요하다면 next(gen, None)처럼 기본값을 지정해 주는 것이 좋습니다.
정리
- 리스트: 슬라이스 연산자
[:N]을 사용하면 가장 간단합니다. - 제너레이터:
itertools.islice()를 사용해야 하며, 메모리 효율성이 뛰어납니다. - 직접 구현:
next()와 반복문으로 유연하게 처리할 수 있습니다.
상황에 맞는 방법을 선택하면 코드의 가독성과 성능을 모두 챙길 수 있습니다. 위 예제들을 직접 실행해 보면서 감각을 익혀 보시길 권합니다.