Câu hỏi Lấy phần tử cuối cùng của một danh sách bằng Python


Trong Python, làm thế nào để bạn có được phần tử cuối cùng của một danh sách?


1392
2018-05-30 19:28


gốc




Các câu trả lời:


some_list[-1] là ngắn nhất và nhiều nhất là Pythonic.

Trong thực tế, bạn có thể làm được nhiều hơn với cú pháp này. Các some_list[-n] cú pháp lấy phần tử thứ n đến cuối. Vì thế some_list[-1] lấy yếu tố cuối cùng, some_list[-2] là người thứ hai cuối cùng, vv, tất cả các con đường xuống some_list[-len(some_list)], cung cấp cho bạn yếu tố đầu tiên.

Bạn cũng có thể thiết lập các phần tử danh sách 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]

2219
2018-05-30 19:29



Nó gây ra lỗi trong danh sách độ dài 0 mà mảng nằm ngoài chỉ mục - Black Mamba
@BlackMamba: Các danh sách độ dài bằng 0 không có phần tử, vì vậy chúng cũng không có phần tử (hoặc đầu tiên hoặc bất kỳ) cuối cùng, do đó truy cập empty_list [-1] rõ ràng là một lỗi. - Kai Petzke


Nếu là của bạn str() hoặc là list() các đối tượng có thể sẽ bị trống như sau: astr = '' hoặc là alist = [], sau đó bạn có thể muốn sử dụng alist[-1:] thay vì alist[-1] cho đối tượng "mẫu".

Ý 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

Trường hợp phân biệt được thực hiện là trả về một đối tượng danh sách trống hoặc đối tượng str trống là nhiều hơn "yếu tố cuối cùng" giống như sau đó một đối tượng ngoại lệ.


182
2017-11-09 23:26



Downvoted vì tôi cảm thấy cốt lõi của câu trả lời này là không chính xác. Lấy danh sách khi bạn muốn một phần tử chỉ trì hoãn "danh sách danh sách không thể tránh khỏi" trong phạm vi "- và đó là những gì sẽ xảy ra khi cố gắng lấy một phần tử từ một danh sách trống. Đối với chuỗi astr [-1:] có thể là một cách tiếp cận hợp lệ vì nó trả về cùng kiểu với astr [-1], nhưng tôi không nghĩ rằng ':' giúp xử lý các danh sách trống (và câu hỏi là về danh sách) . Nếu ý tưởng là sử dụng "alist [-1:]" như là một điều kiện thay vì "len (alist)> 0", tôi nghĩ rằng nó dễ đọc hơn nhiều để sử dụng sau này. (hạnh phúc để upvote nếu tôi bỏ lỡ một cái gì đó) - Stan Kurdziel
Bạn đang bỏ phiếu xuống là dễ hiểu và hợp lệ. Tuy nhiên tôi thấy có hai trại cơ bản về những gì các đối tượng ngoại lệ được dự định. Một điều chắc chắn là các trường hợp ngoại lệ tạm dừng ứng dụng của bạn. Một trại sử dụng các ngoại lệ trong các mệnh đề cố gắng vì trại khác sẽ sử dụng cấu trúc if len (alist)> 0: thay thế. Trong mọi trường hợp, ngoại lệ là các đối tượng ngăn chặn mã của bạn. Và như vậy với tôi là đối tượng chuỗi ít hơn như sau đó trả về "null" hậu quả mà không ngăn chặn mã của bạn. Sở thích của tôi là sử dụng mệnh đề IF để kiểm tra các đối tượng "null" thay vì các đối tượng ngăn chặn mã của tôi mà tôi bị cấm bằng một mệnh đề try. - DevPlayer
Tuy nhiên, tôi đồng ý với @StanKurdziel rằng hình thái học là sai, bạn chỉ cần di chuyển cột mốc - tôi thấy giải pháp của riêng mình liên quan đến việc sử dụng chính 'thêm vào danh sách này nếu bạn đã không đã không thêm nó '(đồ thị đường đồng bằng), do đó, biểu thức kết hợp if len(my_vector) == 0 or my_vector[-1] != update_val là một mô hình khả thi. nhưng nó chắc chắn không phải là một giải pháp toàn cầu - nó sẽ là tốt đẹp để có một dạng cú pháp mà None là kết quả - Mark Mullin
Được bình chọn cho giá trị ám ảnh thuần túy của cuộc thảo luận này. - vwvan
xs[-1] if xs else None - Gabriel


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 bởi vì pop() phương pháp sẽ xóa phần tử cuối cùng.


68
2018-05-30 22:21





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ó rất nhiều phương pháp khác để đạt được mục tiêu như vậy nhưng chúng ngắn và ngọt để sử dụng.


54
2017-08-20 17:41



nếu độ dài danh sách của bạn bằng 0, giải pháp này hoạt động trong khi list[-1] sẽ lỗi. - anon01


Trong Python, làm thế nào để bạn có được phần tử cuối cùng của một danh sách?

Để lấy yếu tố cuối cùng,

  • mà không sửa đổi danh sách và
  • giả sử bạn biết danh sách  một phần tử cuối cùng (tức là nó không phải là rỗng)

vượt qua -1 với ký hiệu chỉ số:

>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'

Giải trình

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à mỗi chỉ mục tham chiếu, 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'

Chuyển nhượng thông qua giải nén có thể lặp lại

Phương thức này có thể thực hiện một cách không cần thiết một danh sách thứ hai cho mục đích chỉ nhận phần tử cuối cùng, nhưng vì lợi ích của sự 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, đầu được liên kết với danh sách mới được tạo không cần thiết:

>>> head
['zero', 'one', 'two']

Nếu bạn định làm gì với danh sách đó, thì đây sẽ là apropos hơn:

*_, last = a_list

Hoặc, thực sự, nếu bạn biết đó là danh sách (hoặc ít nhất chấp nhận ký hiệu chỉ số con):

last = a_list[-1]

Trong một hàm

Một bình luận viên nói:

Tôi muốn Python đã có một chức năng cho đầu tiên () và cuối cùng () như Lisp không ... nó sẽ thoát khỏi rất nhiều chức năng 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 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'

Trường hợp đặc biệt

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 phần tử cuối cùng theo những cách hơi khác nhau.

Nếu bạn mới làm 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ề ngữ nghĩa của các thuật toán 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 không mong muốn trên một dòng mã khác.

Tôi cố gắng cung cấp thông tin và điều kiện đầy đủ nhất có thể, nhưng tôi có thể đã bỏ lỡ điều gì đó. Xin vui lòng bình luận nếu bạn nghĩ rằng tôi đang để lại một báo trước.

Cắt lát

Một lát của mộ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 một danh sách mới:

>>> a_slice = a_list[-1:]
>>> a_slice
['three']

Điều này có xu hướng 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, IndexError mà sẽ cần phải đượ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 cho mục đích này chỉ nên được thực hiện nếu bạn cần:

  • một danh sách mới đã được tạo
  • và danh sách mới sẽ trống nếu danh sách trước đó trống.

for vòng lặp

Là 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 lặp lại toàn bộ danh sách, phần tử cuối cùng sẽ vẫn được tham chiếu bằng 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à ngữ nghĩa điều cuối cùng trong danh sách. Đây là ngữ nghĩa mà cái tên cuối cùng, 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'

Vì vậy, điều này chỉ nên được sử dụng để có được yếu tố cuối cùng nếu bạn

  • đã được lặp lại, và
  • bạn biết vòng lặp sẽ kết thúc (không phá vỡ hoặc thoát do lỗi), nếu không nó sẽ trỏ đến phần tử cuối cùng được tham chiếu bởi vòng lặp.

Bắt và xóa nó

Chúng tôi cũng có thể thay đổi danh sách ban đầu của chúng tôi 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ó đối số chỉ mục):

>>> a_list.pop()
'two'

Chỉ làm điều này nếu

  • bạn biết danh sách có các phần tử trong đó hoặc được chuẩn bị để xử lý ngoại lệ nếu nó trống, và
  • bạn có ý định xóa phần tử cuối cùng khỏi danh sách, xử lý nó như một chồng.

Đây là những trường hợp sử dụng hợp lệ, nhưng không phải là rất phổ biến.

Tiết kiệm phần còn lại của đảo ngược cho sau này:

Tôi không biết tại sao bạn làm điều đó, nhưng vì sự hoàn chỉnh, vì reversed trả về một người 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 lại sau, có lẽ sẽ trông giống như sau:

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

21
2018-06-23 22:05



Giải thích tuyệt vời, điều này nên được bình chọn cao nhất - psrpsrpsr


mylist = [ 1 , 2 , 3 , 4 , 5]

#------------------------------------
# Method-1 : Last index
#------------------------------------

print(mylist[-1])


#------------------------------------
# Method-2 : Using len 
#------------------------------------

print(mylist[len(mylist) - 1])


#------------------------------------
# Method-3 : Using pop, pop will remove the last 
#            element from the list.
#------------------------------------

print(mylist.pop())

6
2018-02-21 09:06





nếu bạn muốn được giá trị cuối cùng của danh sách, bạn nên sử dụng:

your_list[-1]

NHƯNG nếu bạn muốn được giá trị và cũng tẩy từ danh sách, bạn có thể sử dụng:

your_list.pop()

HOẶC LÀ: bạn cũng có thể mở bằng chỉ mục ...

your_list.pop(-1)

5
2017-10-13 12:32





Ok, nhưng những gì về phổ biến trong hầu như mọi cách ngôn ngữ items[len(items) - 1]? Đây là IMO là cách dễ nhất để có được phần tử cuối cùng, bởi vì nó không đòi hỏi bất cứ điều gì NULL hiểu biết.


4
2017-10-07 17:22



các mục [len (items) - 1] về bản chất là những gì Python đang làm dưới mui xe, nhưng vì len của một chuỗi đã được lưu trữ trong chuỗi không cần phải đếm nó, bạn đang tạo ra nhiều công việc hơn là cần thiết. - Dan Gayle
kể từ khi bạn đang viết Python, bạn thực sự nên cố gắng để có thêm Pythonic - Michael Wu
@MichaelWu Không có ý nghĩa để làm điều đó. Pythonic thường không tự giải thích, cần chú ý hơn khi bạn phải giới thiệu người mới vào dự án và, tất nhiên, sẽ không hoạt động khi bạn phải chuyển sang các ngôn ngữ khác như Java - bạn không thể sử dụng kiến ​​thức cụ thể của Python. Khi bạn bỏ qua cách nhiệt tình nhất có thể, thì cũng quay trở lại dự án sau nhiều tháng / năm dễ dàng hơn nhiều. - Radek Anuszewski
@Pneumokok Bạn làm cho điểm, nhưng tôi sẽ lập luận rằng lập chỉ mục danh sách là một rất kỹ thuật Python cơ bản so với máy phát điện nói. Ngoài ra, tại sao phải sử dụng bất kỳ thứ gì khác ngoài C hoặc có thể là javascript nếu bạn không tận dụng lợi thế của các công cụ và cú pháp ngôn ngữ riêng lẻ? Sau đó, bạn có thể liên tục làm mọi thứ một cách khó khăn trong tất cả các dự án của bạn. - Matthew Purdon
Mặc dù nó không phải là rất pythonic Tôi nghĩ rằng đây là một số khía cạnh tốt hơn so với some_list[-1] tiếp cận bởi vì nó hợp lý hơn, và cho thấy những gì nó thực sự làm tốt hơn some_list[-1] theo ý kiến ​​của tôi. - Byron Filer