파이썬에서 목록의 마지막 항목을 얻는 방법?


답변:


519

이를 위해 슬라이싱 연산자와 함께 음의 정수를 사용할 수 있습니다. 다음은 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:]


11
그 주 -0입니다 0. 따라서 마지막 0 요소가 아닌 a[-0:]전체를 반환합니다 . 0을 지키려면을 사용할 수 있습니다 . a[]a[-n:] if n > 0 else []
nekketsuuu

93

음수 색인은 목록 끝부터 계산되므로 다음과 같습니다.

num_list[-9:]

53

슬라이싱

파이썬 슬라이싱은 엄청나게 빠른 작업이며 데이터의 일부에 빠르게 액세스 할 수있는 편리한 방법입니다.

목록에서 마지막 9 개 요소 (또는 문자열과 같이이를 지원하는 다른 시퀀스)를 가져 오는 슬라이스 표기법은 다음과 같습니다.

num_list[-9:]

이것을 볼 때, 괄호 안의 부분을 "끝에서 끝까지 9 번째"로 읽습니다. (실제로, 나는 그것을 정신적으로 "-9, on"으로 약칭한다)

설명:

전체 표기법은

sequence[start:stop:step]

그러나 콜론은 파이썬에게 일반 인덱스가 아닌 슬라이스를 제공한다는 것을 알려주는 것입니다. 그렇기 때문에 파이썬 2에서 목록을 복사하는 관용적 방법은

list_copy = sequence[:]

그리고 그것들을 지우는 것은 다음과 같습니다.

del my_list[:]

(목록을 얻을 list.copylist.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

isliceitertools 모듈에서 이것을 얻는 또 다른 가능한 방법입니다. 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]

당신의 정신 약어는 매우 도움이됩니다
Swanky Coder

40

마지막 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]

6

다음은 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는 타사 라이브러리를 설치해야하며 일부 사용자에게는 유용 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.