슬라이싱(slicing)은 파이썬에서 주어진 리스트의 데이터를 분석할 때 가장 널리 사용되는 기법 중 하나입니다. 하지만 단순히 연속된 구간을 잘라내는 것 외에도, 특정 범위 패턴에 따라 요소를 선택해야 하는 경우가 있습니다. 예를 들어 리스트에서 4개 요소를 건너뛰고 다음 4개 요소만 출력해야 한다고 가정해 보겠습니다. 이번 글에서는 이러한 대체 범위 슬라이싱(alternate range slicing) 개념을 두 가지 방법으로 구현하는 방법을 알아보겠습니다.
1. range()와 len() 활용하기
range() 함수와 len() 함수를 조합하면 리스트 전체 길이를 순회하는 반복문을 만들 수 있으며, 여기에 나눗셈 조건(divisibility test)을 적용해 원하는 요소만 선택합니다.
나눗셈 조건의 동작 원리는 다음과 같습니다.
- 리스트의 k번째 인덱스를 (범위 값 × 2)로 나눈 나머지를 계산합니다.
- 나머지가 범위 값(s)보다 크거나 같으면 해당 요소를 결과에 포함합니다.
- 그렇지 않으면 해당 요소는 제외됩니다.
예제 코드
range_slicing = [6,9,11,15,20,24,29,36,39,43,47,52,56,70,73,79]
print("주어진 리스트: ", range_slicing)
# 범위 값
s = 4
# range()와 len() 활용
result = [range_slicing[k] for k in range(len(range_slicing))
if k % (s * 2) >= s]
print("\n범위 슬라이싱 후 리스트: ", result)실행 결과
주어진 리스트: [6, 9, 11, 15, 20, 24, 29, 36, 39, 43, 47, 52, 56, 70, 73, 79] 범위 슬라이싱 후 리스트: [20, 24, 29, 36, 56, 70, 73, 79]
실행 결과를 보면 인덱스 4~7(값 20, 24, 29, 36)과 인덱스 12~15(값 56, 70, 73, 79)에 해당하는 요소들만 선택된 것을 확인할 수 있습니다. 즉, 4개를 건너뛰고 4개를 선택하는 패턴이 정확히 적용된 것입니다.
2. enumerate() 활용하기
두 번째 방법은 앞서 살펴본 방법과 동일한 논리를 사용하지만, range()와 len()을 조합하는 대신 enumerate() 함수를 활용한다는 점이 다릅니다. enumerate()는 리스트를 순회하면서 인덱스와 값을 동시에 반환하므로 코드가 더 간결해집니다.
참고로 이 예제에서는 범위 값이 5이며, 리스트의 마지막 요소도 나눗셈 조건을 만족하기 때문에 결과에 포함됩니다.
예제 코드
range_slicing = [6,9,11,15,20,24,29,36,39,43,47,52,56,70,73,79]
print("주어진 리스트: ", range_slicing)
# 범위 값
s2 = 5
# enumerate() 활용
result_2 = [val for m, val in enumerate(range_slicing)
if m % (s2 * 2) >= s2]
print("\n범위 슬라이싱 후 리스트: ", result_2)실행 결과
주어진 리스트: [6, 9, 11, 15, 20, 24, 29, 36, 39, 43, 47, 52, 56, 70, 73, 79] 범위 슬라이싱 후 리스트: [24, 29, 36, 39, 43, 79]
정리
파이썬에서 특정 간격 패턴으로 리스트 요소를 선택하는 대체 범위 슬라이싱은 나머지 연산(%)을 활용한 조건 필터링으로 손쉽게 구현할 수 있습니다. range()와 len()을 조합하는 방식과 enumerate()를 사용하는 방식 모두 동일한 결과를 얻을 수 있으며, 상황에 따라 더 읽기 편한 방식을 선택하면 됩니다. 일반적으로 인덱스와 값을 함께 다룰 때는 enumerate()를 사용하는 것이 파이썬다운(Pythonic) 코드 작성에 더 권장됩니다.