이번 포스팅에서는 "배열의 특정 요소만을 불러오는 방법"에 대해서 알아보겠습니다.
먼저, 간단한 예를 보겠습니다.
arr1 = [i+1 for i in range(10)] # 1부터 10까지의 정수로 구성된 배열 생성
print('arr1:', arr1)
new_list = [] # arr1에서 짝수만을 저장할 새로운 배열 생성
for i in range(10): # 반복문을 통해 arr1의 요소들에 순차적으로 접근
if arr1[i]%2 == 0: # 2로 나누었을 때, 나머지가 0인 경우(짝수인 경우)
new_list.append(arr1[i]) # 앞서 만든 빈 배열에 해당 요소를 저장
print('new_list:', new_list)
우리는 1부터 10까지의 정수로 구성된 배열에서 짝수만을 골라서 새로운 배열에 저장하고 싶습니다.
그렇다면, 위와 같이 반복문과 조건문을 통해 새로운 배열을 생성할 수 있습니다.
하지만, 파이썬에서는 이보다 더 간단한 방법을 제공하는데, 바로 "슬라이싱(slicing)"입니다.
기본개념
슬라이싱(slicing) : 배열(or 연속된 객체의 자료형)내의 특정 요소들을 특정 규칙으로 불러오는 방법
사용방법
start : 슬라이싱하고자하는 요소의 첫번째 인덱스
end : 슬라이싱을 마칠 위치
※ end를 "슬라이싱하고자하는 요소의 마지막 인덱스"로 정의하지 않은 이유는 end에 해당하는 인덱스는 포함되지 않기 때문입니다. 즉, "개구간"의 개념과 동일합니다.
step : 슬라이싱할 요소들의 간격
※ "step"의 기본값(Default)은 1입니다.
예제
ex1) 슬라이싱의 기본
arr1 = [i for i in range(10)]
print('arr1:', arr1)
slice1 = arr1[0:3]
print('slice1:', slice1)
slice2 = arr1[0:3:1]
print('slice2:', slice2)
slice1과 slice2의 출력값이 같은 것을 통해 "step"의 기본값은 1임을 확인할 수 있습니다.
슬라이싱 된 데이터(slice1, slice2) 자료형은 "배열"임을 알 수 있습니다.
ex2) step이 양수인 경우
arr1 = [i for i in range(10)]
print('arr1:', arr1)
slice3 = arr1[0:10:2]
print('slice3:', slice3)
step을 2로 설정함으로써, 인덱스 0, 2, 4, 6, 8에 해당하는 값들을 불러왔습니다.
ex3) step이 음수인 경우
arr1 = [i for i in range(10)]
print('arr1:', arr1)
slice4 = arr1[0:10:-1]
print('slice4:', slice4)
slice5 = arr1[10:0:-1]
print('slice5:', slice5)
slice6 = arr1[10:-11:-1]
print('slice6:', slice6)
slice4의 출력결과를 통해 step의 부호는 슬라이싱의 방향을 의미함을 알 수 있습니다.
slice5의 경우, 0이 end에 해당하기 때문에 인덱스 1까지 출력된 것을 확인할 수 있습니다.
slice6의 경우, end값에 -1이 아닌 -11을 입력하여 배열 전체를 역순으로 불러올 수 있었습니다.
이는 arr1의 첫번째 요소 0의 인덱스 값이 0임 동시에 -10이기 때문입니다.
인덱스에 대한 자세한 내용은 다음 포스팅을 참고해주시길 바랍니다.
[파이썬의 기본] 1차원 배열(list)의 인덱싱
이번 포스팅에서는 배열의 특징에 대해서 알아보겠습니다. '배열(list)'이라는 자료형은 다음과 같은 특징을 갖습니다. 1) 배열에 저장된 요소들에는 순서가 있다. (↔집합(set)) 2) 배열에 저장된
look-up-onceaday.tistory.com
ex4) 전체의 슬라이싱
앞서 step에 값을 입력하지 않으면 기본값인 1이 자동으로 부여됨을 확인했습니다.
그렇다면 start, end 에 값을 입력하지 않으면 어떨까요?
값을 입력하지 않음으로써, 전체에 대한 슬라이싱을 보다 쉽게 할 수 있습니다.
ex4-1) start 값의 생략
arr1 = [i for i in range(10)]
print('arr1:', arr1)
slice7 = arr1[:10]
print('slice7:', slice7)
start 값을 생략하고, end 값만 입력함으로써, 10미만의 모든 인덱스에 해당하는 요소들을 불러왔습니다.
ex4-2) end 값의 생략
arr1 = [i for i in range(10)]
print('arr1:', arr1)
slice8 = arr1[1:]
print('slice8:', slice8)
end 값을 생략하고, start 값만 입력함으로써, 1이상의 모든 인덱스에 해당하는 요소들을 불러왔습니다.
ex4-3) start, end 값의 생략
arr1 = [i for i in range(10)]
print('arr1:', arr1)
slice9 = arr1[::]
print('slice9:', slice9)
slice10 = arr1[:]
print('slice10:', slice10)
start 값과 end 값을 모두 생략함으로써, 배열 전체를 불러왔습니다.
slice9과 slice10의 출력 결과가 같음을 통해 대괄호안에 콜론(:)을 1개 입력하나 2개 입력하나 결과는 같음을 알 수 있습니다.
그 원리를 세세히 알아보면 다음과 같습니다.
slice9 : start, end, step 값이 모두 생략(step의 기본값 : 1)
slice10 : start, end 값 생략 / step 입력란의 생략(step의 기본값:1)
※ 주의사항(콜론의 개수)
arr1 = [i for i in range(10)]
print('arr1:', arr1)
slice11 = arr1[::1]
print('slice11:', slice11)
slice12 = arr1[:1]
print('slice12:', slice12)
start 값과 end 값 없이, step 값만을 이용하여 배열을 출력하고 싶은 경우, 반드시 콜론을 2개 모두 입력해야 합니다.
slice11 : start값과 end값의 생략으로 1로 주어진 step에 의해 슬라이싱 되었습니다.
slice12 : step 값으로 입력한 1이 end 값으로 인식되어 0번째 인덱스 값만 슬라이싱 되었습니다.
'파이썬의 기본' 카테고리의 다른 글
[파이썬] matplotlib, ax.plot, linestyle, 그래프 선 유형 설정 (0) | 2024.04.04 |
---|---|
[파이썬] 배열(list)에서의 메소드(method)/내장함수 총정리 (10) | 2022.08.11 |
[파이썬] 1차원 배열(list)의 인덱싱 (0) | 2022.08.08 |
[파이썬] 1차원 배열(list)을 생성하는 다양한 방법 (0) | 2022.08.07 |
댓글