답변:
이를 위해 슬라이싱 연산자와 함께 음의 정수를 사용할 수 있습니다. 다음은 Python CLI 인터프리터를 사용하는 예입니다.
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> a[-9:]
[4, 5, 6, 7, 8, 9, 10, 11, 12]
중요한 라인은 a[-9:]
-0
입니다 0
. 따라서 마지막 0 요소가 아닌 a[-0:]
전체를 반환합니다 . 0을 지키려면을 사용할 수 있습니다 . a
[]
a[-n:] if n > 0 else []
파이썬 슬라이싱은 엄청나게 빠른 작업이며 데이터의 일부에 빠르게 액세스 할 수있는 편리한 방법입니다.
목록에서 마지막 9 개 요소 (또는 문자열과 같이이를 지원하는 다른 시퀀스)를 가져 오는 슬라이스 표기법은 다음과 같습니다.
num_list[-9:]
이것을 볼 때, 괄호 안의 부분을 "끝에서 끝까지 9 번째"로 읽습니다. (실제로, 나는 그것을 정신적으로 "-9, on"으로 약칭한다)
전체 표기법은
sequence[start:stop:step]
그러나 콜론은 파이썬에게 일반 인덱스가 아닌 슬라이스를 제공한다는 것을 알려주는 것입니다. 그렇기 때문에 파이썬 2에서 목록을 복사하는 관용적 방법은
list_copy = sequence[:]
그리고 그것들을 지우는 것은 다음과 같습니다.
del my_list[:]
(목록을 얻을 list.copy
및 list.clear
파이썬 3)
슬라이스를 list.__getitem__
메소드에 전달하는 것과 분리하는 것이 분리하는 것이 유용 할 수 있습니다 ( 대괄호가하는 일 ). 새로운 것이 아니더라도 코드를 더 읽기 쉽게 유지하여 코드를 읽어야하는 다른 사람들이 자신이하는 일을 더 쉽게 이해할 수 있도록합니다.
그러나 콜론으로 구분 된 정수를 변수에 지정할 수는 없습니다. 슬라이스 객체를 사용해야합니다.
last_nine_slice = slice(-9, None)
두 번째 인수는 None
첫 번째 인수는 것으로 해석 될 수 있도록, 필요한 start
인수 그렇지 않으면이 될 것 stop
인수 .
그런 다음 슬라이스 객체를 시퀀스에 전달할 수 있습니다.
>>> list(range(100))[last_nine_slice]
[91, 92, 93, 94, 95, 96, 97, 98, 99]
islice
islice
itertools 모듈에서 이것을 얻는 또 다른 가능한 방법입니다. islice
이상적으로, 부정적인 인수를하지 않는 반복 가능한이있는 __reversed__
특별한 방법 - 목록 않습니다 이 - 처음 목록 (또는 반복자로를 통과해야하므로 __reversed__
으로) reversed
.
>>> from itertools import islice
>>> islice(reversed(range(100)), 0, 9)
<itertools.islice object at 0xffeb87fc>
islice는 데이터 파이프 라인의 지연 평가를 허용하여 데이터를 구체화하고 생성자 (예 :)로 전달합니다 list
.
>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]
마지막 9 개의 요소는 원하는대로 numlist [-9 :]를 사용하여 왼쪽에서 오른쪽으로 또는 numlist [:-10 : -1]을 사용하여 오른쪽에서 왼쪽으로 읽을 수 있습니다.
>>> a=range(17)
>>> print a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> print a[-9:]
[8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> print a[:-10:-1]
[16, 15, 14, 13, 12, 11, 10, 9, 8]
다음은 iterable의 "tail"항목을 가져 오는 몇 가지 옵션입니다.
주어진
n = 9
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
원하는 출력
[2, 3, 4, 5, 6, 7, 8, 9, 10]
암호
다음 옵션 중 하나를 사용하여 후자의 출력을 얻습니다.
from collections import deque
import itertools
import more_itertools
# A: Slicing
iterable[-n:]
# B: Implement an itertools recipe
def tail(n, iterable):
"""Return an iterator over the last *n* items of *iterable*.
>>> t = tail(3, 'ABCDEFG')
>>> list(t)
['E', 'F', 'G']
"""
return iter(deque(iterable, maxlen=n))
list(tail(n, iterable))
# C: Use an implemented recipe, via more_itertools
list(more_itertools.tail(n, iterable))
# D: islice, via itertools
list(itertools.islice(iterable, len(iterable)-n, None))
# E: Negative islice, via more_itertools
list(more_itertools.islice_extended(iterable, -n, None))
세부
iter(iterable)
.itertools
레시피 . 반복 가능한 모든 작업을 수행하고 마지막 솔루션의 반복자 문제를 해결하는 것이 일반적입니다. 이 레시피는 itertools
모듈에 공식적으로 포함되어 있지 않으므로 수동으로 구현해야합니다 .more_itertools
(를 통해 설치 > pip install more-itertools
) 라고합니다 . 참조하십시오 more_itertools.tail
.itertools
도서관 의 일원 . 참고 itertools.islice
부정적인 슬라이스를 지원하지 않습니다 . more_itertools
일반화 itertools.islice
되는 다른 도구가 구현되어 있습니다 . 참조하십시오 more_itertools.islice_extended
.어느 것을 사용합니까?
그것은 달려있다 . 대부분의 경우 슬라이싱 (다른 답변에서 언급 한 옵션 A)은 언어에 내장되어 있으며 대부분의 반복 가능한 유형을 지원하므로 가장 간단한 옵션입니다. 보다 일반적인 반복자의 경우 나머지 옵션을 사용하십시오. 옵션 C 및 E는 타사 라이브러리를 설치해야하며 일부 사용자에게는 유용 할 수 있습니다.