Câu trả lời:
Bạn có thể sử dụng số nguyên âm với toán tử cắt cho điều đó. Đây là một ví dụ sử dụng trình thông dịch 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]
dòng quan trọng là a[-9:]
-0
là 0
. Vì vậy, a[-0:]
trả về toàn bộ a
, không phải là các yếu tố không cuối cùng []
. Để bảo vệ số không, bạn có thể sử dụng a[-n:] if n > 0 else []
.
Python cắt lát là một hoạt động cực kỳ nhanh chóng và đó là một cách thuận tiện để truy cập nhanh các phần dữ liệu của bạn.
Ký hiệu lát để lấy chín phần tử cuối cùng từ một danh sách (hoặc bất kỳ chuỗi nào khác hỗ trợ nó, giống như một chuỗi) sẽ trông như thế này:
num_list[-9:]
Khi tôi thấy điều này, tôi đọc phần trong ngoặc là "thứ 9 từ cuối đến cuối". (Trên thực tế, tôi viết tắt nó là "-9, on")
Ký hiệu đầy đủ là
sequence[start:stop:step]
Nhưng dấu hai chấm là thứ cho Python biết bạn đang cho nó một lát và không phải là một chỉ mục thông thường. Đó là lý do tại sao cách thức sao chép danh sách trong Python 2 là
list_copy = sequence[:]
Và xóa chúng là với:
del my_list[:]
(Danh sách nhận list.copy
và list.clear
trong Python 3.)
Bạn có thể thấy hữu ích khi tách hình thành lát cắt khỏi việc chuyển nó sang list.__getitem__
phương thức ( đó là những gì dấu ngoặc vuông làm ). Ngay cả khi bạn không quen với nó, nó sẽ giữ cho mã của bạn dễ đọc hơn để những người khác có thể phải đọc mã của bạn có thể dễ dàng hiểu những gì bạn đang làm.
Tuy nhiên, bạn không thể chỉ định một số số nguyên được phân tách bằng dấu hai chấm cho một biến. Bạn cần sử dụng đối tượng lát:
last_nine_slice = slice(-9, None)
Đối số thứ hai None
, là bắt buộc, để đối số thứ nhất được hiểu là start
đối số nếu không nó sẽ là stop
đối số .
Sau đó, bạn có thể truyền đối tượng lát vào chuỗi của mình:
>>> list(range(100))[last_nine_slice]
[91, 92, 93, 94, 95, 96, 97, 98, 99]
islice
islice
từ mô-đun itertools là một cách khác có thể thực hiện để có được điều này. islice
không lấy các đối số phủ định, vì vậy lý tưởng là iterable của bạn có một __reversed__
phương thức đặc biệt - danh sách nào có - vì vậy trước tiên bạn phải chuyển danh sách của mình (hoặc lặp lại với __reversed__
) reversed
.
>>> from itertools import islice
>>> islice(reversed(range(100)), 0, 9)
<itertools.islice object at 0xffeb87fc>
islice cho phép đánh giá lười biếng đường ống dữ liệu, vì vậy để cụ thể hóa dữ liệu, hãy chuyển nó đến một hàm tạo (như list
):
>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]
9 yếu tố cuối cùng có thể được đọc từ trái sang phải bằng cách sử dụng numlist [-9:] hoặc từ phải sang trái bằng numlist [: - 10: -1], như bạn muốn.
>>> 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]
Dưới đây là một số tùy chọn để nhận các mục "đuôi" của một lần lặp:
Được
n = 9
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Sản phẩm chất lượng
[2, 3, 4, 5, 6, 7, 8, 9, 10]
Mã
Chúng tôi nhận được đầu ra sau bằng bất kỳ tùy chọn nào sau đây:
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))
Chi tiết
iter(iterable)
.itertools
công thức . Nó được khái quát hóa để làm việc trên bất kỳ lần lặp nào và giải quyết vấn đề lặp trong giải pháp cuối cùng. Công thức này phải được thực hiện thủ công vì nó không được bao gồm chính thức trong itertools
mô-đun.more_itertools
(cài đặt qua > pip install more-itertools
); thấy more_itertools.tail
.itertools
thư viện. Lưu ý, itertools.islice
không hỗ trợ cắt lát âm . more_itertools
đó khái quát hóa itertools.islice
để hỗ trợ cắt lát âm; thấy more_itertools.islice_extended
.Tôi sử dụng cái nào?
Nó phụ thuộc . Trong hầu hết các trường hợp, cắt (tùy chọn A, như được đề cập trong các câu trả lời khác) là tùy chọn đơn giản nhất vì nó được tích hợp vào ngôn ngữ và hỗ trợ hầu hết các loại lặp. Đối với các trình vòng lặp tổng quát hơn, sử dụng bất kỳ tùy chọn còn lại nào. Lưu ý, tùy chọn C và E yêu cầu cài đặt thư viện của bên thứ ba, một số người dùng có thể thấy hữu ích.