Нарезка
Срез Python - это невероятно быстрая операция, и это удобный способ быстрого доступа к частям ваших данных.
Обозначение фрагмента для получения последних девяти элементов из списка (или любой другой последовательности, поддерживающей его, например строки) будет выглядеть так:
num_list[-9:]
Когда я вижу это, я читаю часть в скобках как «9-й от конца до конца». (На самом деле, я мысленно сокращаю его как «-9, на»)
Пояснение:
Полная запись
sequence[start:stop:step]
Но двоеточие - это то, что говорит Python, что вы даете ему фрагмент, а не обычный индекс. Вот почему идиоматический способ копирования списков в Python 2 -
list_copy = sequence[:]
И очистить их можно с помощью:
del my_list[:]
(Списки получают list.copy
и list.clear
в Python 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]