Câu trả lời:
some_list[-1]
là ngắn nhất và Pythonic nhất.
Trong thực tế, bạn có thể làm nhiều hơn với cú pháp này. Các some_list[-n]
cú pháp được các yếu tố thứ n-to-ngoái. Vì vậy, some_list[-1]
có được phần tử cuối cùng, some_list[-2]
phần thứ hai đến cuối cùng, v.v., tất cả các cách xuống some_list[-len(some_list)]
, cung cấp cho bạn phần tử đầu tiên.
Bạn cũng có thể thiết lập danh sách các yếu tố theo cách này. Ví dụ:
>>> some_list = [1, 2, 3]
>>> some_list[-1] = 5 # Set the last element
>>> some_list[-2] = 3 # Set the second to last element
>>> some_list
[1, 3, 5]
Lưu ý rằng việc nhận một mục danh sách theo chỉ mục sẽ tăng IndexError
nếu mục dự kiến không tồn tại. Điều này có nghĩa là some_list[-1]
sẽ đưa ra một ngoại lệ nếu some_list
trống, bởi vì một danh sách trống không thể có phần tử cuối cùng.
Nếu cuối cùng str()
hoặc list()
các đối tượng của bạn có thể trống rỗng như vậy: astr = ''
hoặc alist = []
, thì bạn có thể muốn sử dụng alist[-1:]
thay vì alist[-1]
cho đối tượng "giống nhau".
Ý nghĩa của việc này là:
alist = []
alist[-1] # will generate an IndexError exception whereas
alist[-1:] # will return an empty list
astr = ''
astr[-1] # will generate an IndexError exception whereas
astr[-1:] # will return an empty str
Trong đó sự khác biệt đang được thực hiện là việc trả về một đối tượng danh sách trống hoặc đối tượng str trống là "phần tử cuối cùng" giống như một đối tượng ngoại lệ.
if len(my_vector) == 0 or my_vector[-1] != update_val
là một mẫu khả thi. nhưng nó chắc chắn không phải là một giải pháp toàn cầu - thật tuyệt khi có một hình thức cú pháp trong đó Không có kết quả
xs[-1] if xs else None
Bạn cũng có thể làm:
alist.pop()
Nó phụ thuộc vào những gì bạn muốn làm với danh sách của bạn vì pop()
phương thức sẽ xóa phần tử cuối cùng.
Cách đơn giản nhất để hiển thị phần tử cuối cùng trong python là
>>> list[-1:] # returns indexed value
[3]
>>> list[-1] # returns value
3
có nhiều phương pháp khác để đạt được mục tiêu như vậy nhưng chúng rất ngắn gọn và dễ sử dụng.
list[-1]
sẽ hoạt động trong khi sẽ xảy ra lỗi.
a[-1:][0]
cả ? Dù sao anh cũng cung cấp a[-1]
. Xin giải thích?
Trong Python, làm thế nào để bạn có được phần tử cuối cùng của danh sách?
Để có được yếu tố cuối cùng,
chuyển -1
đến ký hiệu đăng ký:
>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'
Các chỉ mục và lát có thể lấy số nguyên âm làm đối số.
Tôi đã sửa đổi một ví dụ từ tài liệu để chỉ ra mục nào trong chuỗi mỗi tham chiếu chỉ mục, trong trường hợp này, trong chuỗi "Python"
, -1
tham chiếu phần tử cuối cùng, ký tự , 'n'
:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5
-6 -5 -4 -3 -2 -1
>>> p = 'Python'
>>> p[-1]
'n'
Phương pháp này có thể cụ thể hóa một danh sách thứ hai một cách không cần thiết cho mục đích chỉ lấy phần tử cuối cùng, nhưng vì mục đích hoàn chỉnh (và vì nó hỗ trợ bất kỳ danh sách lặp nào - không chỉ danh sách):
>>> *head, last = a_list
>>> last
'three'
Tên biến, head bị ràng buộc với danh sách mới được tạo không cần thiết:
>>> head
['zero', 'one', 'two']
Nếu bạn có ý định không làm gì với danh sách đó, đây sẽ là apropos nhiều hơn:
*_, last = a_list
Hoặc, thực sự, nếu bạn biết đó là một danh sách (hoặc ít nhất là chấp nhận ký hiệu đăng ký):
last = a_list[-1]
Một bình luận cho biết:
Tôi ước Python có một hàm cho First () và last () giống như Lisp ... nó sẽ loại bỏ rất nhiều hàm lambda không cần thiết.
Đây sẽ là khá đơn giản để xác định:
def last(a_list):
return a_list[-1]
def first(a_list):
return a_list[0]
Hoặc sử dụng operator.itemgetter
:
>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)
Trong cả hai trường hợp:
>>> last(a_list)
'three'
>>> first(a_list)
'zero'
Nếu bạn đang làm một cái gì đó phức tạp hơn, bạn có thể thấy nó hiệu quả hơn để có được yếu tố cuối cùng theo những cách hơi khác nhau.
Nếu bạn chưa quen với lập trình, bạn nên tránh phần này, bởi vì nó kết hợp các phần khác nhau về mặt ngữ nghĩa với nhau. Nếu bạn thay đổi thuật toán của mình ở một nơi, nó có thể có tác động ngoài ý muốn đối với một dòng mã khác.
Tôi cố gắng cung cấp sự cẩn thận và điều kiện hoàn toàn nhất có thể, nhưng tôi có thể đã bỏ lỡ điều gì đó. Hãy bình luận nếu bạn nghĩ rằng tôi đang để lại một lời cảnh báo.
Một lát danh sách trả về một danh sách mới - vì vậy chúng ta có thể cắt từ -1 đến cuối nếu chúng ta muốn phần tử trong danh sách mới:
>>> a_slice = a_list[-1:]
>>> a_slice
['three']
Điều này có mặt trái của việc không thất bại nếu danh sách trống:
>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
... do_something(tail)
Trong khi cố gắng truy cập bằng chỉ mục sẽ tăng một IndexError
yêu cầu cần được xử lý:
>>> empty_list[-1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Nhưng một lần nữa, cắt lát cho mục đích này chỉ nên được thực hiện nếu bạn cần:
for
vòng lặpLà một tính năng của Python, không có phạm vi bên trong trong một for
vòng lặp.
Nếu bạn đang thực hiện một lần lặp hoàn chỉnh trên danh sách, phần tử cuối cùng sẽ vẫn được tham chiếu bởi tên biến được gán trong vòng lặp:
>>> def do_something(arg): pass
>>> for item in a_list:
... do_something(item)
...
>>> item
'three'
Đây không phải là điều cuối cùng trong danh sách. Đây là điều cuối cùng mà cái tên item
, bị ràng buộc.
>>> def do_something(arg): raise Exception
>>> for item in a_list:
... do_something(item)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 1, in do_something
Exception
>>> item
'zero'
Do đó, điều này chỉ nên được sử dụng để có được phần tử cuối cùng nếu bạn
Chúng tôi cũng có thể thay đổi danh sách ban đầu của mình bằng cách xóa và trả về phần tử cuối cùng:
>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']
Nhưng bây giờ danh sách ban đầu được sửa đổi.
( -1
thực sự là đối số mặc định, vì vậy list.pop
có thể được sử dụng mà không cần đối số chỉ mục):
>>> a_list.pop()
'two'
Chỉ làm điều này nếu
Đây là những trường hợp sử dụng hợp lệ, nhưng không phổ biến lắm.
Tôi không biết lý do tại sao bạn làm điều đó, nhưng để hoàn thiện, vì reversed
trả về một trình vòng lặp (hỗ trợ giao thức lặp), bạn có thể chuyển kết quả của nó tới next
:
>>> next(reversed([1,2,3]))
3
Vì vậy, nó giống như làm ngược lại điều này:
>>> next(iter([1,2,3]))
1
Nhưng tôi không thể nghĩ ra một lý do chính đáng để làm điều này, trừ khi bạn sẽ cần phần còn lại của trình lặp ngược sau, có lẽ sẽ trông giống như thế này:
reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)
use_later = list(reverse_iterator)
và bây giờ:
>>> use_later
[2, 1]
>>> last_element
3
Để ngăn chặn IndexError: list index out of range
, sử dụng cú pháp này:
mylist = [1, 2, 3, 4]
# With None as default value:
value = mylist and mylist[-1]
# With specified default value (option 1):
value = mylist and mylist[-1] or 'default'
# With specified default value (option 2):
value = mylist[-1] if mylist else 'default'
Một phương pháp khác:
some_list.reverse()
some_list[0]
lst[-1]
là cách tiếp cận tốt nhất, nhưng với các lần lặp chung, hãy xem xét more_itertools.last
:
Mã
import more_itertools as mit
mit.last([0, 1, 2, 3])
# 3
mit.last(iter([1, 2, 3]))
# 3
mit.last([], "some default")
# 'some default'
list[-1]
sẽ lấy phần tử cuối cùng của danh sách mà không thay đổi danh sách.
list.pop()
sẽ lấy phần tử cuối cùng của danh sách, nhưng nó sẽ biến đổi / thay đổi danh sách ban đầu. Thông thường, việc thay đổi danh sách ban đầu không được khuyến khích.
Ngoài ra, nếu, vì một số lý do, bạn đang tìm kiếm thứ gì đó ít pythonic hơn, bạn có thể sử dụng list[len(list)-1]
, giả sử danh sách không trống.
Bạn cũng có thể sử dụng mã bên dưới, nếu bạn không muốn nhận IndexError khi danh sách trống.
next(reversed(some_list), None)
Ok, nhưng những gì về phổ biến trong hầu hết mọi cách ngôn ngữ items[len(items) - 1]
? Đây là IMO cách dễ nhất để có được yếu tố cuối cùng, bởi vì nó không đòi hỏi bất kỳ kiến thức pythonic nào .
some_list[-1]
cách tiếp cận bởi vì nó hợp lý hơn, và cho thấy những gì nó thực sự đang làm tốt hơn some_list[-1]
theo ý kiến của tôi.
some_list.last
- nó sẽ là dòng mã đẹp