Как получить последние элементы списка в Python?

Мне нужны последние 9 номеров списка, и я уверен, что есть способ сделать это с нарезкой, но я не могу его получить. Я могу получить первые 9, как это:

num_list[0:9]

Любая помощь будет большой.

Ответ 1

Для этого можно использовать отрицательные целые числа с оператором резки. Вот пример использования интерпретатора CLI python:

>>> 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:]

Ответ 2

отрицательный индекс будет отсчитываться от конца списка, поэтому:

num_list[-9:]

Ответ 3

Последние 9 элементов можно читать слева направо, используя numlist [-9:] или справа налево, используя числовой список [: - 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]

Ответ 4

Нарезка

Нарезка Python - невероятно быстрая операция, и это удобный способ быстрого доступа к частям ваших данных.

Обозначение фрагмента, чтобы получить последние девять элементов из списка (или любая другая последовательность, которая его поддерживает, например строка), будет выглядеть так:

num_list[-9:]

Когда я вижу это, я читаю часть в скобках как "9-е из конца, до конца". (На самом деле я мысленно сокращаю его как "-9, on" )

Объяснение:

Полная нотация

sequence[start:stop:step]

Но двоеточие - это то, что говорит Python, что вы даете ему срез, а не обычный индекс. Вот почему идиоматический способ копирования списков в Python 2 -

list_copy = sequence[:]

И очистка производится с помощью:

del my_list[:]

(Списки получают list.copy и list.clear в Python 3.)

Дайте своим фрагментам описательное имя!

Вы можете счесть полезным отделить формирование среза от передачи его методу list.__getitem__ ( в противном случае это будет 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]

Ответ 5

Вот несколько вариантов получения "хвоста" элементов итерации:

Дано:

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. Традиционный Python slicing присущ языку. Этот параметр работает с последовательностями, такими как строки, списки и кортежи. Однако этот вид нарезки не работает на итераторах, например. iter(iterable).
  • В. itertools рецепт. Он обобщается для работы над любым итерабельным и разрешает проблему итератора в последнем решении. Этот рецепт должен быть реализован вручную, поскольку он официально не включен в модуль itertools.
  • С. Многие рецепты, включая последний инструмент (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 требуется установка сторонней библиотеки, которую некоторые пользователи могут найти полезной.