본문 바로가기

자료구조

[Python/파이썬] - 배열의 인덱싱과 슬라이싱

1. 인덱싱 방법을 이용하여 리스트 원소에 접근하기

파이썬 리스트에 있는 데이터에 하나씩 접근할 때에는 인덱싱을 사용하게 됩니다. myList[x]가 있을 때  x의 값을 인덱스라고 합니다. x 의 값이 양수일 때와 음수일 때 리스트 원소들에 접근하는 방법이 달라집니다. 

1.1 인덱스가 양수일 경우

myList = [ 1, 2, 3, 4, 5]
print(myList) # [ 1, 2, 3, 4, 5]

# [ ] 안의 값은 원소의 위치의 값(인덱스/Index)
x = myList[3] # 인덱스 값이 양수라면 첫 번째 원소(Index=0)부터 오른쪽으로 이동
print(x) # 4

1.2 인덱스가 음수일 경우

myList = [ 1, 2, 3, 4, 5]
print(myList) # [ 1, 2, 3, 4, 5]

# [ ] 안의 값은 원소의 위치의 값(인덱스/Index)
x = myList[-3] # 인덱스 값이 음수라면 마지막 원소(Index=-1)부터 왼쪽으로 이동
print(x) # 3

 

2. 슬라이싱 방법을 이용하여 리스트 원소들에 접근하기

파이썬 리스트에 있는 여러 개의 데이터에 동시에 접근할 때에는 슬라이싱을 사용하게 됩니다. 파이썬의 리스트의 슬라이싱은 문자열의 슬라이싱과 동일합니다. 아래의 myList[ x : y: z ]가 있을 때 인덱스 x 부터 y-1까지 z 만큼 이동하며 값을 return 받게 됩니다. 위와 마찬가지로 x, y, z 값이 음수일 경우 다르게 동작합니다.

2.1. x, y, z 가 양수일 경우

myList = [ 1, 2, 3, 4, 5]
print(myList) # [ 1, 2, 3, 4, 5]

# 방법 1. 모든 원소를 꺼낼 때
x = myList[:] 
print(x) # [1, 2, 3, 4, 5]

# 방법 2. 특정 인덱스 이전의 모든 값을 꺼낼 때
x = myList[:3]
print(x) # [1, 2, 3]

# 방법 3. 특정 인덱스 이후의 모든 값을 꺼낼 때
x = myList[2:] 
print(x) # [3, 4, 5]

# 방법 4. 특정 구간의 원소를 꺼낼 때
x = myList[0:3] # 0부터 2(:오른쪽 값-1)까지의 원소를 꺼냄
print(x) # [1, 2, 3]

# 방법 5. 일정 간격을 가지고 원소를 꺼낼 때
x = myList[::2] # Index = 0,2,4,6 ...원소들을 꺼냄
print(x) # [1, 3, 5]

# 방법 6.특정 구간의 원소를 일정 간격을 가지고 꺼낼 때 (방법 4 & 5)
x = myList[0:4:3] 
print(x) # [1, 4]

2.2. x, y, z 가 음수일 경우

myList [ x : y : z]에서 x, y, z가 음수일 경우 리스트 원소들에 접근하는 방법이 달라집니다. 

2.2.1. x와 y만 음수일 경우 

먼저 x, y, 인덱스 값이 음수일 때입니다. 인덱스만 바뀌었을 뿐, 원소를 탐색하는 방향은 전과 동일합니다.

myList = [ 1, 2, 3, 4, 5]
print(myList) # [ 1, 2, 3, 4, 5]

# 음수일 경우 인덱스는 가장끝부터 -1로 시작

# 방법 1. 특정 구간의 원소를 꺼낼 때
x = myList[-4:-2] 
print(x) # [2, 3]

# 방법 2. 특정 구간의 원소 일정 간격을 두고 꺼낼 때
x = myList[-5:-1:2] 
print(x) # [1, 3]

# 잘못된 예
x = myList[-2:-4]
print(X) # []

2.2.2. z만 음수일 경우

z(step값) 이 음수일 경우 리스트에 접근하는 방법이 많이 달라집니다. 원래 왼쪽 가장 작은 index부터 시작해서 오른쪽 마지막 index로 이동하는 방법과는 달리 오른쪽 뒤의 index부터 왼쪽 앞의 index로 이동하는 것을 볼 수 있습니다.

시작과 끝은 양수고,  스텝만 음수인 경우

myList = [ 1, 2, 3, 4, 5]
print(myList) # [ 1, 2, 3, 4, 5]

# 방법 1. 모든 값을 거꾸로 꺼낼 때
x = myList[::-1]
print(x) # [5,4,3,2,1]

# 방법 2. 일정 간격을 가지고 특정 인덱스에서 값을 거꾸로 꺼낼 때
x = myList[4:0:-2] # 위의 인덱스 방법처럼 
print(x) # [5,3]

2.2.3. x, y, z 모두 음수일 경우

이제 2.2.1. & 2.2.2의 개념을 합쳐서 x,y,z가 모두 음수일 경우 어떻게 동작하는 지 아래에서 확인해 보겠습니다. 

시작, 끝, 스텝이 모두 음수인 경우

myList = [ 1, 2, 3, 4, 5]
print(myList) # [ 1, 2, 3, 4, 5]

# 음수일 경우 가장 끝 인덱스(-1) 부터 시작

# 방법 1.특정 구간의 원소를 일정 간격을 가지고 꺼낼 때 
x = myList[-1:-5:-2] # 
print(x) # [5,3]

# 잘못된 예
x = myList[-5:-1:-2]
print(x) # []

2.2.4. x, y, z에 양수, 음수가 혼합되어 있을 경우

myList [ x : y : z ]에서 x, y, z 값들에 양수와 음수가 혼합되어 사용될 수 있습니다. 다만, 이때에는 z의 값을 보고 어느 방향(양수: 시작 -> 끝 / 음수: 끝 -> 시작)으로 원소를 추출 해 내는지 생각해 보면 쉽게 사용할 수 있습니다.

 

먼저 x와 z가 양수고, y가 음수인 경우입니다.

시작과 스텝은 양수고, 끝이 음수인 경우

 아래는 x와 z가 음수고, y가 양수인 경우입니다.

myList = [ 1, 2, 3, 4, 5]
print(myList) # [ 1, 2, 3, 4, 5]

# 음수일 경우 가장 끝 인덱스(-1) 부터 시작

# 방법 1.특정 구간의 원소를 일정 간격을 가지고 꺼낼 때 
x = myList[1:-1:2] # 
print(x) # [2,4]

# 방법 2.특정 구간의 원소를 일정 간격을 가지고 꺼낼 때 
x = myList[-1:1:-2] # 
print(x) # [5,3]

 

위의 예시들처럼 리스트의 슬라이싱방법은 양수와 음수를 혼합하여 다양하게 사용될 수 있습니다. 리스트의 슬라이싱을 공부하면 파이썬 내에서 문자열의 슬라이싱 또한 동일하게 사용할 수 있습니다.