Mendapatkan elemen terakhir dari daftar

2067

Dengan Python, bagaimana Anda mendapatkan elemen terakhir dari daftar?

Janusz
sumber

Jawaban:

3109

some_list[-1] adalah yang terpendek dan paling Pythonic.

Bahkan, Anda dapat melakukan lebih banyak dengan sintaks ini. The some_list[-n]sintaks mendapat elemen n-to-lalu. Jadi some_list[-1]dapatkan elemen terakhir, some_list[-2]dapatkan yang kedua ke yang terakhir, dll, semuanya some_list[-len(some_list)], yang memberi Anda elemen pertama.

Anda juga dapat mengatur elemen daftar dengan cara ini. Contohnya:

>>> 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]

Perhatikan bahwa mendapatkan item daftar menurut indeks akan meningkatkan IndexErrorjika item yang diharapkan tidak ada. Ini berarti bahwa some_list[-1]akan memunculkan pengecualian jika some_listkosong, karena daftar kosong tidak dapat memiliki elemen terakhir.

Sasha Chedygov
sumber
6
Saya melewatkan sesuatu seperti some_list.last- itu akan menjadi baris kode yang indah
Dmitry P.
257

Jika objek str()atau Anda list()mungkin menjadi kosong seperti itu: astr = ''atau alist = [], maka Anda mungkin ingin menggunakan alist[-1:]alih-alih alist[-1]untuk objek "kesamaan".

Arti penting dari ini adalah:

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

Di mana perbedaan yang dibuat adalah bahwa mengembalikan objek daftar kosong atau objek str kosong lebih "elemen terakhir" -seperti objek pengecualian.

DevPlayer
sumber
26
Diturunkan karena saya merasa inti dari jawaban ini salah. Mendapatkan daftar ketika Anda menginginkan sebuah elemen hanya menunda "indeks daftar di luar jangkauan" yang tak terhindarkan - dan itulah yang harus terjadi ketika mencoba untuk mendapatkan elemen dari daftar kosong. Untuk Strings astr [-1:] bisa menjadi pendekatan yang valid karena mengembalikan tipe yang sama dengan astr [-1], tapi saya rasa ':' tidak membantu menangani daftar kosong (dan pertanyaannya adalah tentang daftar) . Jika idenya adalah menggunakan "alist [-1:]" sebagai sebuah kondisional daripada "len (alist)> 0", saya pikir itu jauh lebih mudah dibaca untuk digunakan nanti. (Senang
membesarkan
9
Suara Anda turun dapat dimengerti dan valid. Namun saya menemukan ada dua kemah dasar pada objek pengecualian apa yang dimaksudkan. Satu kepastian adalah bahwa pengecualian menghentikan aplikasi Anda. Satu kamp menggunakan pengecualian dalam klausa percobaan karena kamp lain akan menggunakan if len (daftar)> 0: struktur sebagai gantinya. Bagaimanapun, pengecualian adalah objek yang menghentikan kode Anda. Dan dengan demikian bagi saya adalah objek urutan kurang seperti kemudian dikembalikan "null" -setelah yang tidak menghentikan kode Anda. Preferensi saya adalah menggunakan klausa IF untuk menguji objek "null" alih-alih objek yang menghentikan kode saya yang saya dahului dengan klausa coba.
DevPlayer
6
Terpilih karena sintaks slice layak didiskusikan, namun saya setuju dengan @StanKurdziel bahwa morfologinya salah, Anda hanya memindahkan tiang gawang - Saya menemukan solusi saya sendiri terkait dengan penggunaan utama 'tambahkan ini ke daftar jika Anda tidak 'sudah menambahkannya' (grafik garis delta), jadi ekspresi gabungan if len(my_vector) == 0 or my_vector[-1] != update_valadalah pola yang bisa diterapkan. tapi itu jelas bukan solusi global - alangkah baiknya memiliki bentuk sintaks di mana Tidak ada hasilnya
Mark Mullin
17
xs[-1] if xs else None
Gabriel
2
Mengapa Anda "menghindari" IndexError? Jika Anda mencoba untuk mengindeks daftar atau string kosong, Anda akan mendapatkan pengecualian. Jika Anda ingin menangani pengecualian itu, gunakan coba / kecuali - itulah gunanya.
Chris Johnson
94

Anda juga dapat melakukan:

alist.pop()

Itu tergantung pada apa yang ingin Anda lakukan dengan daftar Anda karena pop()metode ini akan menghapus elemen terakhir.

Taurus Olson
sumber
71

Cara paling sederhana untuk menampilkan elemen terakhir dalam python adalah

>>> list[-1:] # returns indexed value
    [3]
>>> list[-1]  # returns value
    3

ada banyak metode lain untuk mencapai tujuan seperti itu tetapi ini pendek dan manis untuk digunakan.

Atul Arvind
sumber
2
jika panjang daftar Anda nol, solusi ini berfungsi sementara list[-1]akan salah.
anon01
Apa? Mengapa Anda lakukan a[-1:][0] sama sekali ? Dia juga menyediakan a[-1]. Penjelasannya tolong?
kaboom
52

Dengan Python, bagaimana Anda mendapatkan elemen terakhir dari daftar?

Untuk mendapatkan elemen terakhir,

  • tanpa mengubah daftar, dan
  • dengan asumsi Anda tahu daftar memiliki elemen terakhir (yaitu tidak kosong)

lolos -1ke notasi subskrip:

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

Penjelasan

Indeks dan irisan dapat mengambil bilangan bulat negatif sebagai argumen.

Saya telah memodifikasi contoh dari dokumentasi untuk menunjukkan item dalam urutan masing-masing referensi indeks, dalam hal ini, dalam string "Python", -1referensi elemen terakhir, karakter, 'n':

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
   0   1   2   3   4   5 
  -6  -5  -4  -3  -2  -1

>>> p = 'Python'
>>> p[-1]
'n'

Tugas melalui membongkar iterable

Metode ini mungkin secara tidak perlu memunculkan daftar kedua untuk tujuan mendapatkan elemen terakhir, tetapi demi kelengkapan (dan karena mendukung setiap iterable - bukan hanya daftar):

>>> *head, last = a_list
>>> last
'three'

Nama variabel, head terikat ke daftar yang baru dibuat yang tidak perlu:

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

Jika Anda tidak ingin melakukan apa pun dengan daftar itu, ini akan menjadi lebih penting:

*_, last = a_list

Atau, sungguh, jika Anda tahu itu daftar (atau paling tidak menerima notasi subskrip):

last = a_list[-1]

Dalam suatu fungsi

Seorang komentator berkata:

Saya berharap Python memiliki fungsi untuk first () dan last () seperti Lisp tidak ... itu akan menghilangkan banyak fungsi lambda yang tidak perlu.

Ini akan sangat sederhana untuk didefinisikan:

def last(a_list):
    return a_list[-1]

def first(a_list):
    return a_list[0]

Atau gunakan operator.itemgetter:

>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)

Dalam kedua kasus:

>>> last(a_list)
'three'
>>> first(a_list)
'zero'

Kasus khusus

Jika Anda melakukan sesuatu yang lebih rumit, Anda mungkin akan mendapatkan kinerja lebih tinggi untuk mendapatkan elemen terakhir dengan cara yang sedikit berbeda.

Jika Anda baru dalam pemrograman, Anda harus menghindari bagian ini, karena itu menggabungkan bagian algoritma yang semantik berbeda secara bersamaan. Jika Anda mengubah algoritme Anda di satu tempat, itu mungkin memiliki dampak yang tidak diinginkan pada baris kode lain.

Saya mencoba memberikan peringatan dan kondisi selengkap mungkin, tetapi saya mungkin melewatkan sesuatu. Tolong beri komentar jika Anda pikir saya akan meninggalkan peringatan.

Mengiris

Sepotong daftar mengembalikan daftar baru - jadi kita dapat mengiris dari -1 hingga akhir jika kita ingin elemen dalam daftar baru:

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

Sisi baiknya adalah tidak gagal jika daftar kosong:

>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
...     do_something(tail)

Sedangkan upaya untuk mengakses menurut indeks menimbulkan suatu IndexErroryang perlu ditangani:

>>> empty_list[-1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Tetapi sekali lagi, mengiris untuk tujuan ini hanya boleh dilakukan jika Anda membutuhkan:

  • daftar baru dibuat
  • dan daftar baru kosong jika daftar sebelumnya kosong.

for loop

Sebagai fitur Python, tidak ada pelingkupan batin dalam satu forlingkaran.

Jika Anda sudah melakukan iterasi lengkap pada daftar, elemen terakhir masih akan dirujuk oleh nama variabel yang ditetapkan dalam loop:

>>> def do_something(arg): pass
>>> for item in a_list:
...     do_something(item)
...     
>>> item
'three'

Ini bukan secara semantik hal terakhir dalam daftar. Ini adalah hal terakhir yang nama itemitu terikat.

>>> 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'

Jadi ini seharusnya hanya digunakan untuk mendapatkan elemen terakhir jika Anda

  • sudah berulang, dan
  • Anda tahu loop akan selesai (tidak pecah atau keluar karena kesalahan), jika tidak maka akan menunjuk ke elemen terakhir yang dirujuk oleh loop.

Mendapatkan dan menghapusnya

Kami juga dapat mengubah daftar asli kami dengan menghapus dan mengembalikan elemen terakhir:

>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']

Tetapi sekarang daftar asli dimodifikasi.

( -1sebenarnya adalah argumen default, jadi list.popdapat digunakan tanpa argumen indeks):

>>> a_list.pop()
'two'

Hanya lakukan ini jika

  • Anda tahu daftar memiliki elemen di dalamnya, atau siap untuk menangani pengecualian jika kosong, dan
  • Anda memang bermaksud untuk menghapus elemen terakhir dari daftar, memperlakukannya seperti tumpukan.

Ini adalah kasus penggunaan yang valid, tetapi tidak terlalu umum.

Menyimpan sisa dari pembalikan untuk nanti:

Saya tidak tahu mengapa Anda melakukannya, tetapi untuk kelengkapannya, karena reversedmengembalikan iterator (yang mendukung protokol iterator), Anda dapat meneruskan hasilnya ke next:

>>> next(reversed([1,2,3]))
3

Jadi itu seperti melakukan kebalikan dari ini:

>>> next(iter([1,2,3]))
1

Tapi saya tidak bisa memikirkan alasan yang baik untuk melakukan ini, kecuali Anda akan memerlukan sisa iterator terbalik nanti, yang mungkin akan terlihat lebih seperti ini:

reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)

use_later = list(reverse_iterator)

dan sekarang:

>>> use_later
[2, 1]
>>> last_element
3
Aaron Hall
sumber
14

Untuk mencegah IndexError: list index out of range, gunakan sintaks ini:

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'
Valentin Podkamennyi
sumber
11

Metode lain:

some_list.reverse() 
some_list[0]
Sanjay Pradeep
sumber
10

lst[-1]adalah pendekatan terbaik, tetapi dengan iterables umum, pertimbangkan more_itertools.last:

Kode

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'
pylang
sumber
6

list[-1]akan mengambil elemen terakhir dari daftar tanpa mengubah daftar. list.pop()akan mengambil elemen terakhir dari daftar, tetapi akan mengubah / mengubah daftar asli. Biasanya, mengubah daftar asli tidak disarankan.

Atau, jika, karena alasan tertentu, Anda mencari sesuatu yang kurang pythonic, Anda dapat menggunakan list[len(list)-1], dengan asumsi daftar tersebut tidak kosong.

Sondering Narsisis
sumber
2
Mungkin buruk untuk berasumsi bahwa memutasi daftar asli biasanya tidak disarankan, karena, bagaimanapun juga, itu sangat umum dilakukan
Aaron
6

Anda juga dapat menggunakan kode di bawah ini, jika Anda tidak ingin mendapatkan IndexError saat daftar kosong.

next(reversed(some_list), None)
Yavuz Mester
sumber
4

Oke, tapi bagaimana dengan hampir di semua bahasa items[len(items) - 1]? Ini adalah IMO cara termudah untuk mendapatkan elemen terakhir, karena tidak memerlukan pengetahuan pythonic apa pun .

Radek Anuszewski
sumber
3
item [len (items) - 1] pada dasarnya adalah apa yang dilakukan Python di bawah tenda, tetapi karena len dari suatu urutan sudah disimpan dalam urutan, tidak perlu untuk menghitungnya, Anda membuat lebih banyak pekerjaan daripada yang diperlukan.
Dan Gayle
21
karena Anda sedang menulis Python, Anda benar-benar harus berusaha menjadi lebih Pythonic
Michael Wu
5
@MichaelWu Tidak masuk akal untuk melakukan itu. Cara Pythonic seringkali tidak jelas, perlu lebih banyak perhatian di mana Anda harus memperkenalkan orang baru ke proyek dan, tentu saja, tidak akan berfungsi ketika Anda harus beralih ke bahasa lain seperti Jawa - Anda tidak dapat menggunakan pengetahuan khusus Python. Ketika Anda menghilangkan cara pythonic sebanyak mungkin, maka kembali ke proyek setelah bulan / tahun jauh lebih mudah.
Radek Anuszewski
7
@ Pneumokok Anda membuat poin, tapi saya berpendapat bahwa pengindeksan daftar adalah teknik Python yang sangat dasar dibandingkan dengan mengatakan generator. Juga, mengapa repot-repot menggunakan apa pun selain C atau mungkin javascript jika Anda tidak akan memanfaatkan alat bahasa dan sintaksis individu? Maka Anda dapat secara konsisten melakukan semuanya dengan cara yang sulit di semua proyek Anda.
Matthew Purdon
Walaupun itu tidak terlalu pythonic, saya pikir ini dalam beberapa hal lebih baik daripada some_list[-1]pendekatan karena lebih logis, dan menunjukkan apa yang sebenarnya dilakukan lebih baik daripada some_list[-1]menurut saya.
Byron Filer