본문 바로가기
정보/기술

파이썬 슬라이싱 범위 설명

by 라초딩 2024. 12. 21.

파이썬에서 슬라이싱(a[start:end])의 동작 방식은 범위를 지정할 때 다음과 같은 규칙을 따른다.

  1. start는 포함(포함되는 첫 번째 인덱스): 슬라이스의 시작 인덱스(start)는 결과에 포함됩니다. 즉, start 인덱스의 요소부터 결과에 포함됩니다.
  2. end는 제외(포함되지 않는 마지막 인덱스): 슬라이스의 끝 인덱스(end)는 결과에 포함되지 않습니다. 즉, end 인덱스는 슬라이스 범위에서 제외됩니다.

이 방식은 반열린구간(half-open interval) 이라는 개념을 따릅니다. 수학적으로는 [start, end)의 범위로 볼 수 있습니다.


왜 이렇게 설계되었는가?

이 설계는 다음과 같은 이유로 매우 편리합니다:

  1. 길이를 계산하기 쉬움: 슬라이스의 길이는 end - start로 간단히 계산됩니다.
    예: a[1:3]에서 길이는 3 - 1 = 2입니다. 따라서 결과는 2개의 요소(4, 2)입니다.
  2. 범위를 나누거나 연결하기 쉬움: 리스트를 나눌 때 겹치지 않도록 쉽게 구간을 나눌 수 있습니다.end를 제외하므로, 나눈 구간끼리 연결할 때 중복되지 않습니다.
  3. a = [3, 4, 2, 1] part1 = a[0:2] # [3, 4] part2 = a[2:4] # [2, 1] combined = part1 + part2 # [3, 4, 2, 1]
  4. 빈 슬라이스를 쉽게 표현: startend가 같으면 빈 슬라이스를 명확히 표현할 수 있습니다.
  5. a[2:2] # []

예제로 이해하기

리스트 a = [3, 4, 2, 1]에서 a[1:3]의 경우:

  • start = 1: 인덱스 1의 값 4부터 포함됩니다.
  • end = 3: 인덱스 3의 값 1은 포함되지 않습니다.

결과적으로, 인덱스 1과 2의 요소인 [4, 2]가 반환됩니다.


end가 제외되는 이유로 인한 착각

end가 제외되는 방식 때문에, 원하는 값을 포함시키려면 end를 +1 해야 합니다. 이는 파이썬에서 슬라이스가 항상 "끝은 포함되지 않는다"는 규칙을 따르기 때문입니다.


추가적인 팁

만약 리스트 전체에서 특정 부분만 잘라내고 싶다면, 다음과 같이 사용 가능합니다:

  • a[:n]: 처음부터 인덱스 n-1까지 포함 (n은 제외)
  • a[n:]: 인덱스 n부터 끝까지 포함
  • a[:]: 리스트 전체를 복사

이처럼 반열린구간 방식은 많은 작업에서 편리함을 제공합니다.

원하는 곳에 데이터 집어 넣기

a 리스트에서 원하는 위치에 새로운 데이터를 추가하려면 insert() 메서드를 사용할 수 있습니다.

insert() 메서드

a.insert(index, value)
  • index: 데이터를 삽입할 위치의 인덱스 (이 인덱스에 있는 기존 요소는 오른쪽으로 이동합니다).
  • value: 삽입하려는 값.

예제

리스트 a = [3, 4, 2, 1]가 있고, 01 사이에 새로운 데이터를 추가하려고 한다면, 인덱스 1 이후에 추가하면 됩니다.

a = [3, 4, 2, 1]

# 0과 1 사이에 '5'를 추가
a.insert(1, 5)
print(a)  # [3, 5, 4, 2, 1]

동작 방식

  • insert(1, 5)는 인덱스 1에 값을 삽입합니다.
  • 기존 요소 4는 한 칸 뒤로 밀립니다.

다른 예시

리스트의 맨 앞에 삽입

a = [3, 4, 2, 1]
a.insert(0, 99)
print(a)  # [99, 3, 4, 2, 1]

리스트의 맨 끝에 삽입 (append와 동일한 효과)

a = [3, 4, 2, 1]
a.insert(len(a), 77)
print(a)  # [3, 4, 2, 1, 77]

리스트 중간에 여러 번 삽입

a = [3, 4, 2, 1]
a.insert(2, 10)  # [3, 4, 10, 2, 1]
a.insert(3, 20)  # [3, 4, 10, 20, 2, 1]
print(a)

insert()를 활용하면 원하는 위치에 데이터를 추가할 수 있습니다. append()는 항상 맨 끝에 추가하는 데 사용됩니다.

댓글