파이썬

[Python] 슬라이싱 이해하기

zooheon 2022. 7. 31. 14:03
반응형

파이썬 슬라이싱에 대한 좋은 설명이 필요합니다(참조는 플러스).

 

구문은 다음과 같습니다.

a[start:stop]  # items start through stop-1
a[start:]      # items start through the rest of the array
a[:stop]       # items from the beginning through stop-1
a[:]           # a copy of the whole array

step위의 모든 항목과 함께 사용할 수 있는 값 도 있습니다.

a[start:stop:step] # start through not past stop, by step

기억해야 할 요점은 값 이 선택한 슬라이스에 없는:stop 첫 번째 값을 나타낸다는 것입니다 . 따라서 와 의 차이는 선택한 요소의 수입니다( 이 1이면 기본값).stopstartstep

다른 기능은 음수 start이거나 음수stop 일 수 있다는 것입니다. 즉, 시작이 아닌 배열의 끝에서 계산됩니다. 그래서:

a[-1]    # last item in the array
a[-2:]   # last two items in the array
a[:-2]   # everything except the last two items

마찬가지로 step음수일 수 있습니다.

a[::-1]    # all items in the array, reversed
a[1::-1]   # the first two items, reversed
a[:-3:-1]  # the last two items, reversed
a[-3::-1]  # everything except the last two items, reversed

파이썬은 당신이 요구하는 것보다 적은 항목이 있다면 프로그래머에게 친절합니다. 예를 들어, 요청 a[:-2]하고 a하나의 요소만 포함하는 경우 오류 대신 빈 목록이 표시됩니다. 때로는 오류를 선호하므로 이런 일이 발생할 수 있음을 알아야 합니다.

slice개체 와의 관계

slice객체 는 슬라이싱 작업을 나타낼 수 있습니다. 예 :

a[start:stop:step]

는 다음과 같습니다.

a[slice(start, stop, step)]

Slice 객체는 와 유사하게 인수의 수에 따라 약간 다르게 작동합니다 . range()즉, 둘 다 slice(stop)지원 slice(start, stop[, step])됩니다. 주어진 인수 지정하는 것을 건너뛰려면 를 사용할 None있습니다 .a[start:]a[slice(start, None)]a[::-1]a[slice(None, None, -1)]

:- 기반 표기법은 간단한 슬라이싱에 매우 유용 하지만 slice()객체를 명시적으로 사용하면 프로그래밍 방식으로 슬라이싱을 생성할 수 있습니다.

 

Python 튜토리얼 에서 이에 대해 설명합니다(슬라이싱에 대한 부분이 나올 때까지 아래로 스크롤).

ASCII 아트 다이어그램은 슬라이스 작동 방식을 기억하는 데에도 유용합니다.

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1

슬라이스가 작동하는 방식을 기억하는 한 가지 방법은 인덱스 가 문자 사이 를 가리키는 것으로 생각하는 것입니다 . 첫 번째 문자의 왼쪽 가장자리는 0으로 번호가 매겨져 있습니다. 그런 다음 n개의 문자열에서 마지막 문자의 오른쪽 가장자리 는 인덱스 n 을 갖 습니다.

 

시퀀스에 대한 문법이 허용하는 가능성 열거 x:

>>> x[:]                # [x[0],   x[1],          ..., x[-1]    ]
>>> x[low:]             # [x[low], x[low+1],      ..., x[-1]    ]
>>> x[:high]            # [x[0],   x[1],          ..., x[high-1]]
>>> x[low:high]         # [x[low], x[low+1],      ..., x[high-1]]
>>> x[::stride]         # [x[0],   x[stride],     ..., x[-1]    ]
>>> x[low::stride]      # [x[low], x[low+stride], ..., x[-1]    ]
>>> x[:high:stride]     # [x[0],   x[stride],     ..., x[high-1]]
>>> x[low:high:stride]  # [x[low], x[low+stride], ..., x[high-1]]

물론 이면 (high-low)%stride != 0끝점은 보다 약간 낮을 것 high-1입니다.

음수 이면 stride카운트다운 중이므로 순서가 약간 변경됩니다.

>>> x[::-stride]        # [x[-1],   x[-1-stride],   ..., x[0]    ]
>>> x[high::-stride]    # [x[high], x[high-stride], ..., x[0]    ]
>>> x[:low:-stride]     # [x[-1],   x[-1-stride],   ..., x[low+1]]
>>> x[high:low:-stride] # [x[high], x[high-stride], ..., x[low+1]]

확장 슬라이싱(쉼표 및 타원 포함)은 주로 NumPy와 같은 특수 데이터 구조에서만 사용됩니다. 기본 시퀀스는 이들을 지원하지 않습니다.

>>> class slicee:
...     def __getitem__(self, item):
...         return repr(item)
...
>>> slicee()[0, 1:2, ::5, ...]
'(0, slice(1, 2, None), slice(None, None, 5), Ellipsis)'

 

반응형