1 minute read

이번엔 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