본문 바로가기
[R&D] 프로그래밍/Python

[Python] 슬라이싱 (slicing) 개념 및 사용 방법

by Geuni 2022. 7. 6. 06:02
728x90
반응형

Slicing 이란?

슬라이싱은 list, tuple, numpy, string와 같이 연속적인 객체에서 특정 범위를 선택해 새로운 객체를 만드는 것을 말합니다.

newObject = iterableObject[start:end:step]

기본적인 형태는 위와 같은데 보기와 같이 인덱싱(indexing)이 가능한 객체들에 사용할 수 있습니다.


Slicing 사용 방법

import numpy as np

testList = [0, 1, 2, 3, 4, 5, 6]
testTuple = (0, 1, 2, 3, 4, 5, 6)
testNumpy = np.array([0, 1, 2, 3, 4, 5, 6])
testString = '0123456'

slicingList = testList[2:]
slicingTuple = testTuple[:5]
slicingNumpy = testNumpy[:]
slicingString = testString[::2]

print('slicingList :', slicingList)     # slicingList : [2, 3, 4, 5, 6]
print('slicingTuple :', slicingTuple)   # slicingTuple : (0, 1, 2, 3, 4)
print('slicingNumpy :', slicingNumpy)   # slicingNumpy : [0 1 2 3 4 5 6]
print('slicingString :', slicingString) # slicingString : 0246

간단하게 도식화하면 아래와 같습니다.

[start:end:step] 항목에 대해 간단히 설명하면,

  • start : 슬라이싱을 시작 할 인덱스를 말하며, 값을 쓰지 않으면 시작지점인 0을 가리킴
  • end : 슬라이싱을 마칠 인덱스를 말하며, 값을 쓰지 않으면 마지막 인덱스를 가리킴
  • step : start 부터 end 까지 인덱싱할 단위를 말하는데, 값을 쓰지 않거나 표기 자체를 하지 않으면 1씩 나아감

참고로 위 그림을 보면 배열의 인덱스는 0~6까지입니다.

하지만 슬라이싱할 때는 end 포인트의 직전까지 자르기 때문에 하나 더 큰 7을 end로 설정해야 모든 배열을 담을 수 있습니다.


tip)
슬라이싱은 깊은 복사(deep copy)로 객체를 생성합니다.
그런데 복사하는 시간은 deepcopy 모듈을 사용하는 것 보다 매우 빠르기 때문에 iterative한 객체의 깊은 복사가 필요할 때는 슬라이싱으로 하는 것이 효율적입니다.
testList = [idx for idx in range(10000000)]

copyList1 = deepcopy(testList)
copyList2 = testList[:]
copyList3 = testList.copy() # only list

# (module) copy time : 3.1784658432006836
# (slicing) copy time : 0.06482791900634766
# (list method) copy time : 0.06084251403808594​

단, list의 경우 copy 메소드가 아주 미세하게 더 빠른 것을 볼 수 있음


Slicing 역순으로 접근하기

슬라이싱 범위를 지정할 때 음수로도 접근이 가능합니다. (이는 인덱싱도 동일한 개념)

testList = [0, 1, 2, 3, 4, 5, 6]

# indexing
print(testList[-2]) # 5

# slicing
slicingList1 = testList[-4:-1]
slicingList2 = testList[:-2:2]

print('slicingList1 :', slicingList1)     # slicingList : [3, 4, 5]
print('slicingList2 :', slicingList2)     # slicingList : [0, 2, 4]

위 그림과 같이 마지막 인덱스(7)에서 반대로(음수) 이동한 곳이 기준이라고 보면 됩니다.


step도 마찬가지로 음수로 접근이 가능합니다.

하지만 단순히 위치만 지정하는 start, end 와는 다르게 역순으로 진행됩니다.

testList = [0, 1, 2, 3, 4, 5, 6]

slicingList1 = testList[::2]
slicingList2 = testList[::-2]
slicingList3 = testList[6:2:-2]
slicingList4 = testList[2:6:-2]

print('slicingList1 :', slicingList1) # slicingList1 : [0, 2, 4, 6]
print('slicingList2 :', slicingList2) # slicingList2 : [6, 4, 2, 0]
print('slicingList3 :', slicingList3) # slicingList3 : [6, 4]
print('slicingList4 :', slicingList4) # slicingList4 : []

 

728x90
반응형

댓글