나는 목록의 마지막 9 숫자가 필요하고 슬라이싱으로 할 수있는 방법이 있다고 확신하지만 그것을 얻을 수없는 것 같습니다. 다음과 같이 처음 9 개를 얻을 수 있습니다.
num_list[0:9]
답변
이를 위해 슬라이싱 연산자와 함께 음의 정수를 사용할 수 있습니다. 다음은 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:]
답변
음수 색인은 목록 끝부터 계산되므로 다음과 같습니다.
num_list[-9:]
답변
슬라이싱
파이썬 슬라이싱은 엄청나게 빠른 작업이며 데이터의 일부에 빠르게 액세스 할 수있는 편리한 방법입니다.
목록에서 마지막 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))
세부
- A. 전통적인 파이썬 슬라이싱 은 언어에 내재되어 있습니다. 이 옵션은 문자열, 목록 및 튜플과 같은 시퀀스에서 작동합니다 . 그러나 이런 종류의 슬라이싱은 예를 들어 반복자 에서는 작동하지 않습니다
iter(iterable)
. - B.
itertools
레시피 . 반복 가능한 모든 작업을 수행하고 마지막 솔루션의 반복자 문제를 해결하는 것이 일반적입니다. 이 레시피는itertools
모듈에 공식적으로 포함되어 있지 않으므로 수동으로 구현해야합니다 . - C. 후자 도구 (B)를 포함한 많은 레시피가 타사 패키지로 편리하게 구현되었습니다. 이러한 라이브러리를 설치하고 가져 오면 수동 구현이 필요하지 않습니다. 이 라이브러리 중 하나를
more_itertools
(를 통해 설치> pip install more-itertools
) 라고합니다 . 참조하십시오more_itertools.tail
. - D.
itertools
도서관 의 일원 . 참고itertools.islice
부정적인 슬라이스를 지원하지 않습니다 . - E. 네거티브 슬라이싱을 지원하기 위해
more_itertools
일반화itertools.islice
되는 다른 도구가 구현되어 있습니다 . 참조하십시오more_itertools.islice_extended
.
어느 것을 사용합니까?
그것은 달려있다 . 대부분의 경우 슬라이싱 (다른 답변에서 언급 한 옵션 A)은 언어에 내장되어 있으며 대부분의 반복 가능한 유형을 지원하므로 가장 간단한 옵션입니다. 보다 일반적인 반복자의 경우 나머지 옵션을 사용하십시오. 옵션 C 및 E는 타사 라이브러리를 설치해야하며 일부 사용자에게는 유용 할 수 있습니다.