Bagaimana cara menghapus elemen dari daftar menurut indeks dengan Python?
Saya menemukan list.remove
metode, tetapi katakan saya ingin menghapus elemen terakhir, bagaimana saya melakukan ini? Sepertinya default menghapus pencarian daftar, tetapi saya tidak ingin pencarian dilakukan.
O(n)
dalam operasi waktu.deque()
menyediakan operasi yang efisien di kedua ujungnya tetapi tidak memberikan O (1) penyisipan / pencarian / penghapusan di tengah.O(n)
akses indeksa[i]
(karena tertaut-daftar). Catatan: implementasi berbasis array menyediakanO(1)
akses indeks.Jawaban:
Gunakan
del
dan tentukan indeks elemen yang ingin Anda hapus:Juga mendukung irisan:
Ini bagian dari tutorial.
sumber
PyList_GetItem()
dasarnya mengembalikan((PyListObject *)op) -> ob_item[i];
-i
elemen array.Anda mungkin ingin
pop
:Secara default,
pop
tanpa argumen apa pun menghapus item terakhir:sumber
pop()
dengan sendirinya sangat jelas, sementarapop(-1)
berpotensi membingungkan justru karena berlebihan.pop
dalam sebagian besar bahasa pemrograman biasanya menghapus item terakhir, seperti halnya dalam Python. Jadi apakah Anda menentukan -1 atau tidak sama dengan itu.pop()
mengembalikan elemen apa pun yang dihapusnya.Seperti orang lain disebutkan pop dan del adalah yang cara efisien untuk menghapus item dari indeks yang diberikan. Namun hanya demi penyelesaian (karena hal yang sama dapat dilakukan melalui banyak cara dengan Python):
Menggunakan irisan (ini tidak dilakukan untuk menghapus item dari daftar asli):
(Juga ini akan menjadi metode yang paling tidak efisien ketika bekerja dengan daftar Python, tetapi ini bisa berguna (tapi tidak efisien, saya tegaskan kembali) ketika bekerja dengan objek yang ditentukan pengguna yang tidak mendukung pop, belum mendefinisikan a
__getitem__
):Catatan: Harap dicatat bahwa metode ini tidak mengubah daftar di tempat seperti
pop
dandel
. Alih-alih itu membuat dua salinan daftar (satu dari awal sampai indeks tetapi tanpa itu (a[:index]
) dan satu setelah indeks sampai elemen terakhir (a[index+1:]
)) dan membuat objek daftar baru dengan menambahkan keduanya. Ini kemudian dipindahkan ke variabel daftar (a
). Objek daftar lama karenanya direferensi dan karenanya sampah dikumpulkan (asalkan objek daftar asli tidak dirujuk oleh variabel apa pun selain a).Ini membuat metode ini sangat tidak efisien dan juga dapat menghasilkan efek samping yang tidak diinginkan (terutama ketika variabel lain menunjuk ke objek daftar asli yang tetap tidak dimodifikasi).
Terima kasih kepada @MarkDickinson karena menunjukkan ini ...
Ini jawaban Stack Overflow menjelaskan konsep mengiris.
Perhatikan juga bahwa ini hanya berfungsi dengan indeks positif.
Saat menggunakan dengan objek,
__getitem__
metode harus didefinisikan dan yang lebih penting__add__
metode harus didefinisikan untuk mengembalikan objek yang berisi item dari kedua operan.Intinya, ini bekerja dengan objek apa pun yang definisi kelasnya seperti:
Ini bekerja dengan
list
yang mendefinisikan__getitem__
dan__add__
metode.Perbandingan tiga cara dalam hal efisiensi:
Anggaplah yang berikut ini sudah ditentukan sebelumnya:
Itu
del object[index]
Metode:Sejauh ini metode yang paling efisien. Berhasil semua objek yang mendefinisikan a
__del__
metode.Pembongkarannya adalah sebagai berikut:
Kode:
Membongkar:
pop
metode:Itu kurang efisien daripada metode del dan digunakan ketika Anda perlu mendapatkan item yang dihapus.
Kode:
Membongkar:
Iris dan tambahkan metode.
Paling tidak efisien.
Kode:
Membongkar:
Catatan: Dalam ketiga disassemble mengabaikan dua baris terakhir yang pada dasarnya adalah
return None
. Juga dua baris pertama memuat nilai globala
danindex
.sumber
a = a[:index] + a[index+1 :]
-trick adalah savest, ketika datang ke daftar besar. Semua metode lain berakhir di jalan buntu. Jadi terima kasih banyakpop
juga berguna untuk menghapus dan menyimpan item dari daftar. Di manadel
sebenarnya membuang item.sumber
Jika Anda ingin menghapus elemen posisi tertentu dalam daftar, seperti 2, 3, dan 7. kamu tidak bisa menggunakan
Karena setelah Anda menghapus elemen kedua, elemen ketiga yang Anda hapus sebenarnya adalah elemen keempat dalam daftar asli. Anda dapat memfilter elemen 2, 3 dan 7 di daftar asli dan mendapatkan daftar baru, seperti di bawah ini:
sumber
Ini tergantung pada apa yang ingin Anda lakukan.
Jika Anda ingin mengembalikan elemen yang Anda hapus, gunakan
pop()
:Namun, jika Anda hanya ingin menghapus suatu elemen, gunakan
del
:Selain itu,
del
memungkinkan Anda untuk menggunakan irisan (misalnyadel[2:]
).sumber
Secara umum, saya menggunakan metode berikut:
sumber
Namun cara lain untuk menghapus elemen dari daftar dengan indeks.
a [x: y] menunjuk ke elemen-elemen dari indeks
x
key-1
. Ketika kami mendeklarasikan bagian daftar itu sebagai daftar kosong ([]
), elemen-elemen itu dihapus.sumber
Anda bisa mencari item yang ingin Anda hapus. Ini sangat sederhana. Contoh:
Output: acde
sumber
Gunakan kode berikut untuk menghapus elemen dari daftar:
Jika Anda ingin menghapus data elemen indeks dari daftar gunakan:
sumber
Seperti disebutkan sebelumnya, praktik terbaik adalah del (); atau pop () jika Anda perlu tahu nilainya.
Solusi alternatif adalah menumpuk kembali hanya elemen-elemen yang Anda inginkan:
eta: hmm ... tidak akan berfungsi pada nilai indeks negatif, akan direnungkan dan diperbarui
Saya seharusnya
akan menambalnya ... tapi tiba-tiba ide ini tampaknya sangat rapuh. Eksperimen pemikiran yang menarik. Tampaknya harus ada cara yang 'tepat' untuk melakukan ini dengan append () / daftar pemahaman.
merenungkan
sumber
del()
? Untuk fungsi itu Anda memberikan daftar sebagai argumen pertama untuk fungsi itu dan kemudian indeks, atau indeks pertama dan kemudian daftar? Apakah itu mengembalikan argumen daftar tanpa item, atau apakah itu menghapus tempat. Saya tahu tentangdel
pernyataan itu, tetapi bukan tentang fungsi dengan nama yang sama.Kedengarannya tidak seperti Anda bekerja dengan daftar daftar, jadi saya akan membuat ini singkat. Anda ingin menggunakan pop karena itu akan menghapus elemen bukan elemen yang daftar, Anda harus menggunakan del untuk itu. Untuk memanggil elemen terakhir dalam python itu "-1"
sumber
pop()
dandel
keduanya menghapus elemen pada indeks yang disediakan, terlepas dari apakah elemen itu sendiri daftar atau tidak.a = [1, [2, 3], 4]; del a[1]; b = [1, [2, 3], 4]; b.pop(1); assert a == b
l - daftar nilai; kita harus menghapus indeks dari daftar inds2rem .
sumber
<map at 0x7f4d54109a58>
. dan l adalah kisaran (0,20)Gunakan fungsi "del" :
Misalnya, jika Anda ingin menghapus 3 item terakhir, kode Anda harus:
Misalnya, jika Anda ingin menghapus 8 item terakhir, kode Anda harus:
sumber
del
adalah sebuah pernyataan . Jika itu sebuah fungsi, Anda harus menulisdel(listame[-N])
Telah disebutkan bagaimana menghapus satu elemen dari daftar dan keuntungan apa yang dimiliki metode yang berbeda. Perhatikan, bagaimanapun, menghapus beberapa elemen berpotensi menyebabkan kesalahan:
Elemen 3 dan 8 (bukan 3 dan 7) dari daftar asli telah dihapus (karena daftar itu dipersingkat selama loop), yang mungkin bukan maksudnya. Jika Anda ingin menghapus beberapa indeks dengan aman, Anda harus menghapus elemen dengan indeks tertinggi terlebih dahulu, misalnya seperti ini:
sumber
Atau jika beberapa indeks harus dihapus:
Tentu saja bisa juga dilakukan:
sumber
Anda dapat menggunakan del atau pop untuk menghapus elemen dari daftar berdasarkan indeks. Pop akan mencetak anggota yang dihapus dari daftar, sementara daftar menghapus anggota tersebut tanpa mencetaknya.
sumber
Anda dapat menggunakan del atau pop, tetapi saya lebih suka del, karena Anda dapat menentukan indeks dan irisan, memberi pengguna lebih banyak kontrol atas data.
Misalnya, dimulai dengan daftar yang ditampilkan, seseorang dapat menghapus elemen terakhirnya dengan
del
irisan, dan kemudian seseorang dapat menghapus elemen terakhir dari hasil menggunakanpop
.sumber