[Python] Python 의 인덱싱과 슬라이싱에 대해
이번엔 Python 의 인덱싱과 슬라이싱에 대해서 알아보고자 합니다. Python 의 인덱싱과 슬라이싱에 대해 알아보는 이유는 이번 기회를 통해 Python 에서 굉장히 자주 사용되는 슬라이싱에 대해서 정리를 하고, 추후에 정리한 내용들을 바로 바로 찾아볼 수 있도록 하기 위함입니다.
인덱싱
인덱싱이란 Python 에서 리스트, 문자열, 튜플 등 순서가 있는 자료형에서 특정 위치의 값을 참조하는 것입니다. 인덱싱은 Python 에서 제공하는 자료형뿐만 아니라 numpy 의 ndarry 나 pytorch 의 tensor 에도 적용이 가능하므로 알고 있으면 유용하게 사용할 수 있습니다.
1. 인덱싱 기초
인덱스는 0부터 시작합니다.
fruits = ['apple', 'banana', 'cherry']
print(fruits[0]) # apple
print(fruits[1]) # banana
print(fruits[2]) # cherry
2. 음수 인덱스
Python 은 뒤에서부터 참조하는 음수 인덱스도 지원합니다. 주로 자료형의 마지막 부근에 있는 데이터들을 조회할 때 사용됩니다.
print(fruits[-1]) # cherry (마지막 요소)
print(fruits[-2]) # banana
print(fruits[-3]) # apple
슬라이싱
슬라이싱은 시퀀스 자료형의 일부를 잘라내는 방법입니다. 프로그램을 만들다 보면 배열이나 리스트 등에서 특정 부분 데이터가 필요한 경우가 굉장히 많습니다. C 나 Java 같은 언어들은 특정 부분이 필요할 경우 반복문을 통해서 가져와야 하지만 Python 은 슬라이싱을 통해 단 한 줄만으로도 가능합니다.
1. 슬라이싱 기초
start:end
형식이며, start는 포함, end 는 미포함입니다.
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[1:4]) # [1, 2, 3]
2. 슬라이싱 심화
- start 생략 : 처음부터 시작
- end 생략 : 끝까지
- 모두 생략 : 전체
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[:3]) # [0, 1, 2]
print(numbers[3:]) # [3, 4, 5]
print(numbers[:]) # [0, 1, 2, 3, 4, 5]
3. 슬라이싱의 step
슬라이싱은 start:end:step
형식도 가능하며 step 은 몇 칸을 건너뛰어서 요소를 출력할건지에 대한 정보입니다.
- step=2 : 두 칸씩 건너뜀
- step=-1 : 역방향 슬라이싱(리버스)
참고로 역방향 슬라이싱의 경우 백준과 같은 알고리즘 문제 풀 때 사용하면 오답을 받게 되는 경우가 발생하니 알고리즘 문제를 풀거나 코딩 테스트 시험을 보실 때에는 사용에 주의하셔야 합니다.
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[::2]) # [0, 2, 4] (2칸씩 건너뜀)
print(numbers[::-1]) # [5, 4, 3, 2, 1, 0] (역순)
4. 슬라이싱과 복사 (얕은 복사 vs 깊은 복사)
슬라이싱은 새로운 객체를 생성하지만, 그 안의 내용이 변할 수 있는 경우 얕은 복사가 됩니다.
a = [[1, 2], [3, 4]]
b = a[:]
b[0][0] = 99
print(a) # [[99, 2], [3, 4]] → 내부 리스트는 공유됨!
완전히 복사하려면 copy.deepcopy() 를 이용하면 됩니다.
요약 정리
- 인덱싱 : 특정 위치의 요소를 가져옴 (data[0], data[-1])
- 슬라이싱 : 구간을 잘라내어 서브시퀀스를 만듦 (data[start:end:step])
- 문자열/리스트/튜플 모두 슬라이싱 가능하지만, 불변 객체는 수정 불가 (문자열, 튜플)
- 슬라이싱은 얕은 복사를 유의해야 함
Comments