티스토리 뷰

Programming/python

파이썬 리스트 슬라이싱

tech_curioso 2019. 4. 8. 11:54
728x90
반응형

파이썬 리스트 자료 구조에 데이터가 저장되어 있을 때 이들 중 일부를 선택하거나 정리하는데 첨자들을 넣어 간단히 골라낼 수 있다. 

[ start: stop] = [ 이상 : 미만 ] 

먼저 인덱스 첨자 두개는 시작 인덱스와 정지 인덱스 두개로 표현된다. 문제는 이렇게만 하면 정확한 의미가 전달이 안된다. 첫번째 시작 인덱스는 해당 인덱스를 포함(이상)하고 정지 인덱스는 해당 인덱스를 포함하지 않는다(미만). 그래서 다음코드 처럼 [1:10]인 경우 인덱스 1이상부터 인덱스 10미만(9까지)까지를 골라내라는 뜻이 된다. 

sample = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q']
print(sample[1:10])

결과는 다음과 같이 리스트에 두번째 데이터(인덱스가 0부터 시작하므로 인덱스 1은 두번째 데이터에 해당)부터 총 9개의 데이터를 슬라이싱하여 선택된 데이터가 디스플레이 되는 것을 알 수 있다. 

['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

여기에 아예 인덱스를 둘중에 하나 비우면 그 의미는 '처음부터' 또는 '마지막까지'라는 의미가 된다. 즉, 다음 예제에서 [10:]는 10이상부터 마지막 데이터까지를 의미하고 [:10]은 처음부터 10미만까지의 데이터를 슬라이싱하라는 의미가 된다.  마지막으로 많이 쓰이지는 않지만 둘다 비워놓은 [:]은 처음부터 마지막까지 데이터를 의미하게 된다. 결국 sample[:]은 sample 리스트의 모든 데이터를 나타내게 되므로 sample과 동일한 의미이다. 

print(sample[10:])
print(sample[:10])
print(sample[:])

실행한 결과는 다음과 같다.

['k', 'l', 'm', 'n', 'o', 'p', 'q']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q']

 

리스트의 데이터 숫자가 변하는 경우 가장 마지막 인덱스는 알기가 힘들다. 물론 len명령으로 전체 리스트의 데이터 수를 파악할 수 있지만 필요할 때마다 명령을 써야 하는 번거로움이 있다. 이때 필요한 것이 음수 인덱스이다.  리스트는 맨앞에서 0부터 시작한다. 그런데 맨 마지막을 표현하는 음수 인덱스로 -1을 사용한다. -2는 마지막에서 하나 이전 위치를 나타내게 된다. 

 

다음과 같이 사용할 수 있는데 [-1:]은 마지막 위치의 데이터 부터(포함) 마지막까지라는 의미로 마지막 데이터만을 의미하게 된다. [:-1]은 처음부터 마지막미만까지의 데이터를 의미하므로 리스트의 마지막 데이터를 제외한 전체 데이터를 의미하게 된다. 같은 방식으로 [-3:]은 마지막에서 두번째 앞이상부터 끝까지의 데이터를 [:-3]은 처음부터 마지막에서 두번째 앞 미만까지의 데이터를 의미하게 된다.

print(sample[-1:])
print(sample[:-1])
print(sample[-3:])
print(sample[:-3])

결과는 다음과 같음을 확인해 볼 수 있다.

['q']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p']
['o', 'p', 'q']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']

 

[ start: stop: step] = [ 이상 : 미만 : 단계 ] 

첨자가 세개가 사용되는 것은 앞의 두개는 앞서 설명한 부분과 동일하고 마지막이 step을 나타낸다. 몇단계로 증가 내지 감소할 것인가의 의미로 2면 인덱스가 1씩이 아니라 2씩 증가시켜 리스트에서 데이터를 뽑아내는 것을 의미한다. 

print(sample[::2])
print(sample[::3])

위의 코드에서 [::2]는 모든 데이터를 2씩 인덱스를 증가시켜가면서 슬라이싱하라는 것이며 [::3]은 3씩 증가시켜 가면서 슬라이싱하라는 의미로 출력결과가 다음과 같다. 

['a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q']
['a', 'd', 'g', 'j', 'm', 'p']

 

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함