Мне нужны последние 9 номеров списка, и я уверен, что есть способ сделать это с нарезкой, но я не могу его получить. Я могу получить первые 9, как это:
num_list[0:9]
Любая помощь будет большой.
Мне нужны последние 9 номеров списка, и я уверен, что есть способ сделать это с нарезкой, но я не могу его получить. Я могу получить первые 9, как это:
num_list[0:9]
Любая помощь будет большой.
Для этого можно использовать отрицательные целые числа с оператором резки. Вот пример использования интерпретатора 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:]
отрицательный индекс будет отсчитываться от конца списка, поэтому:
num_list[-9:]
Последние 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]
Нарезка 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]
Вот несколько вариантов получения "хвоста" элементов итерации:
Дано:
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 требуется установка сторонней библиотеки, которую некоторые пользователи могут найти полезной.