질문
Python의 슬라이스 표기법은 어떻게 작동하나요? 즉, a[x:y:z]
, a[:]
, a[::2]
등과 같은 코드를 작성할 때, 어떤 요소가 슬라이스에 포함되는지 이해하는 방법은 무엇인가요? 적절한 참조를 포함해주세요.
표기법의 디자인 결정에 대한 논의를 위해서는 Why are slice and range upper-bound exclusive?를 참조하십시오.
슬라이싱의 가장 일반적인 실제 사용 사례인 리스트에서 매 N번째 항목 가져오기 (그리고 이 문제를 해결하는 다른 방법)에 대해서는 Pythonic way to return list of every nth item in a larger list를 참조하십시오. 적절한 경우 이 질문을 중복 대상으로 사용하십시오.
슬라이스 할당에 대한 더 구체적인 답변은 How does assignment work with list slices?를 참조하십시오 (이것도 여기에서 다루어짐).
답변
구문은 다음과 같습니다:
a[start:stop] # 시작부터 stop-1까지의 항목
a[start:] # 시작부터 배열의 나머지 항목
a[:stop] # 처음부터 stop-1까지의 항목
a[:] # 전체 배열의 사본
또한 위의 모든 것과 함께 사용할 수 있는 step
값이 있습니다:
a[start:stop:step] # start부터 stop을 지나치지 않고 step으로
기억해야 할 중요한 점은 :stop
값이 선택한 슬라이스에 포함되지 않는 첫 번째 값이라는 것입니다. 따라서 stop
과 start
의 차이는 선택한 요소의 수입니다 (step
이 1이면 기본값).
다른 기능은 start
또는 stop
이 음수 일 수 있다는 것입니다. 이는 시작이 아닌 배열의 끝에서 계산된다는 것을 의미합니다. 그래서:
a[-1] # 배열의 마지막 항목
a[-2:] # 배열의 마지막 두 항목
a[:-2] # 마지막 두 항목을 제외한 모든 것
마찬가지로, step
은 음수 일 수 있습니다:
a[::-1] # 모든 항목을 반대로 뒤집은 배열
a[1::-1] # 처음 두 항목을 반대로 뒤집은 배열
a[:-3:-1] # 마지막 두 항목을 반대로 뒤집은 배열
a[-3::-1] # 마지막 두 항목을 제외한 모든 항목을 반대로 뒤집은 배열
파이썬은 요청한 항목보다 항목이 적을 경우 프로그래머에게 친절합니다. 예를 들어, a[:-2]
를 요청하고 a
에 항목이 하나만 포함되어 있으면 오류 대신 빈 목록이 반환됩니다. 때로는 오류를 원할 수 있으므로 이러한 상황에 대해 인식해야합니다.
slice
객체와의 관계
slice
객체는 슬라이싱 작업을 나타낼 수 있습니다. 즉:
a[start:stop:step]
는 다음과 같습니다:
a[slice(start, stop, step)]
슬라이스 객체는 인수의 수에 따라 range()
와 유사하게 약간 다르게 동작합니다. 즉, slice(stop)
과 slice(start, stop[, step])
모두 지원됩니다.
주어진 인수를 지정하지 않으려면 None
을 사용할 수 있으므로 예를 들어 a[start:]
는 a[slice(start, None)]
또는 a[::-1]
은 a[slice(None, None, -1)]
과 동일합니다.
:
기반 표기법은 간단한 슬라이싱에 매우 유용하지만 slice()
객체의 명시적 사용은 슬라이싱의 프로그래밍적 생성을 간소화합니다.
댓글