Apakah mungkin menghapus beberapa elemen sekaligus dari daftar? Jika saya ingin menghapus elemen pada indeks 0 dan 2, dan mencoba sesuatu seperti del somelist[0]
, diikuti oleh del somelist[2]
, pernyataan kedua sebenarnya akan dihapus somelist[3]
.
Saya kira saya selalu bisa menghapus elemen bernomor lebih tinggi terlebih dahulu, tetapi saya berharap ada cara yang lebih baik.
somelist = [ lst[i] for i in xrange(len(lst)) if i not in set(indices) ]
:?Untuk beberapa alasan saya tidak suka jawaban di sini. Ya, mereka bekerja, tetapi sebenarnya sebagian besar dari mereka tidak menghapus elemen dalam daftar, bukan? (Tetapi membuat salinan dan kemudian mengganti yang asli dengan salinan yang diedit).
Kenapa tidak hapus saja indeks yang lebih tinggi dulu?
Apakah ada alasan untuk ini? Saya hanya akan melakukan:
Jika Anda benar-benar tidak ingin menghapus item mundur, maka saya kira Anda hanya harus deincrement nilai indeks yang lebih besar dari indeks yang dihapus terakhir (tidak dapat benar-benar menggunakan indeks yang sama karena Anda memiliki daftar yang berbeda) atau menggunakan salinan daftar (yang tidak akan 'dihapus' tetapi mengganti yang asli dengan salinan yang diedit).
Apakah saya kehilangan sesuatu di sini, ada alasan untuk TIDAK menghapus dalam urutan terbalik?
sumber
Jika Anda menghapus beberapa item yang tidak berdekatan, maka apa yang Anda gambarkan adalah cara terbaik (dan ya, pastikan untuk memulai dari indeks tertinggi).
Jika item Anda berdekatan, Anda dapat menggunakan sintaks penugasan slice:
sumber
del a[2:10]
dengan efek yang sama.Anda dapat menggunakan
numpy.delete
sebagai berikut:Jika Anda tidak keberatan berakhir dengan
numpy
array di bagian akhir, Anda dapat meninggalkan.tolist()
. Anda juga harus melihat peningkatan kecepatan yang cukup besar, menjadikan ini solusi yang lebih skalabel. Saya belum membandingkannya, tetapinumpy
operasi dikompilasi kode yang ditulis dalam C atau Fortran.sumber
Sebagai spesialisasi jawaban Greg, Anda bahkan dapat menggunakan sintaks irisan yang diperluas. misalnya. Jika Anda ingin menghapus item 0 dan 2:
Tentu saja, ini tidak mencakup pemilihan yang sewenang-wenang, tetapi tentu saja dapat menghapus semua item.
sumber
Sebagai fungsi:
Berjalan dalam waktu n log (n) , yang seharusnya menjadikannya solusi tercepat tercepat.
sumber
n log n
? Betulkah? Saya tidak berpikirdel list[index]
O (1).Jadi, Anda pada dasarnya ingin menghapus beberapa elemen sekaligus? Dalam hal ini, posisi elemen berikutnya yang akan dihapus akan diimbangi dengan banyaknya yang dihapus sebelumnya.
Tujuan kami adalah menghapus semua vokal, yang diperhitungkan sebagai indeks 1, 4, dan 7. Perhatikan bahwa yang penting adalah indeks to_delete dalam urutan menaik, jika tidak maka tidak akan berfungsi.
Akan lebih rumit jika Anda ingin menghapus elemen dalam urutan apa pun. IMO, menyortir
to_delete
mungkin lebih mudah daripada mencari tahu kapan Anda harus atau tidak harus mengurangiindex
.sumber
Saya seorang pemula total dalam Python, dan pemrograman saya saat ini adalah kasar dan kotor untuk sedikitnya, tetapi solusi saya adalah dengan menggunakan kombinasi dari perintah dasar yang saya pelajari di tutorial awal:
Jelas, karena harus memilih karakter "mark-for-deletion", ini memiliki keterbatasan.
Adapun kinerja sebagai ukuran daftar skala, saya yakin solusi saya tidak optimal. Namun, ini mudah, yang saya harap menarik bagi pemula lain, dan akan bekerja dalam kasus-kasus sederhana di mana
some_list
adalah format yang terkenal, misalnya, selalu numerik ...sumber
Berikut ini adalah alternatif, yang tidak menggunakan enumerate () untuk membuat tupel (seperti dalam jawaban asli SilentGhost).
Ini sepertinya lebih mudah dibaca oleh saya. (Mungkin saya akan merasa berbeda jika saya terbiasa menggunakan penghitungan.) CAVEAT: Saya belum menguji kinerja dari dua pendekatan.
CATATAN: Sintaks Python 2.7. Untuk Python 3,
xrange
=>range
.Pemakaian:
somelist:
--- BONUS ---
Hapus beberapa nilai dari daftar. Artinya, kami memiliki nilai yang ingin kami hapus:
Pemakaian:
somelist:
Ini adalah jawaban yang sama seperti sebelumnya, tetapi kali ini kami menyediakan NILAI yang akan dihapus
[0, 44, 55]
.sumber
[ value for (i, value) in enumerate(lst) if i not in set(indices) ]
. Tetapi saya akan meninggalkan jawaban saya di sini, karena saya juga menunjukkan cara menghapus berdasarkan nilai. Ini kasus yang lebih mudah, tetapi mungkin bisa membantu seseorang.indices_as_set = set(indices)
,[ value for (i, value) in enumerate(lst) if i not in indices_as_set ]
, untuk mempercepat itu.delete__by_values()
?Metode pemahaman daftar alternatif yang menggunakan nilai indeks daftar:
Ini mengembalikan:
sumber
index
menyesatkan karena dalam daftar iterator digunakan metodeindex()
di sini adalah metode lain yang menghilangkan elemen di tempatnya. juga jika daftar Anda sangat panjang, lebih cepat.
sumber
Ini telah disebutkan, tetapi entah bagaimana tidak ada yang berhasil melakukannya dengan benar.
Pada
O(n)
solusi akan menjadi:Ini sangat dekat dengan versi SilentGhost , tetapi menambahkan dua kawat gigi.
sumber
O(n)
jika Anda menghitung pencarian yang dilakukanlog(len(indices))
untuk setiap iterasi.j not in indices
adalahO(1)
.j not in indices
masih memerlukan pencarian, yaituO(log(len(indices)))
. Sementara saya setuju bahwa pencarian dalam set 2 elemen memenuhi syarat sebagaiO(1)
, dalam kasus umum akanO(log(N))
. Either wayO(N log(N))
masih berdetakO(N^2)
.j not in indices
adalahO(1)
, serius.Ini pada dasarnya sama dengan jawaban terpilih, hanya cara penulisan yang berbeda. Perhatikan bahwa menggunakan l.index () bukan ide yang baik, karena ia tidak dapat menangani elemen yang digandakan dalam daftar.
sumber
Metode penghapusan akan menyebabkan banyak pergeseran elemen daftar. Saya pikir lebih baik membuat salinan:
sumber
secara teknis, jawabannya TIDAK, tidak mungkin menghapus dua objek PADA SAAT YANG SAMA. Namun, itu mungkin untuk menghapus dua objek dalam satu baris python yang indah.
akan secara berulang menghapus
foo['bar']
, kemudianfoo['baz']
sumber
kita dapat melakukan ini dengan menggunakan perulangan for iterating di atas indeks setelah mengurutkan daftar indeks dalam urutan menurun
sumber
Untuk indeks 0 dan 2 dari listA:
Untuk beberapa indeks acak untuk dihapus dari listA:
sumber
Saya ingin cara untuk membandingkan berbagai solusi yang membuatnya mudah untuk memutar kenop.
Pertama saya menghasilkan data saya:
Lalu saya mendefinisikan fungsi saya:
Kemudian saya
timeit
membandingkan solusi:Keluaran
Jadi generator dengan indeks dalam
set
adalah pemenangnya. Dandel
sedikit lebih cepatpop
.sumber
Anda dapat menggunakan logika ini:
sumber
Implementasi lain dari gagasan menghapus dari indeks tertinggi.
sumber
Saya benar-benar dapat memikirkan dua cara untuk melakukannya:
iris daftar seperti (ini menghapus elemen 1, 3 dan 8)
somelist = somelist [1: 2] + somelist [3: 7] + somelist [8:]
lakukan itu di tempat, tetapi satu per satu:
somelist.pop (2) somelist.pop (0)
sumber
Anda dapat melakukannya dengan cara dict, bukan pada daftar. Dalam daftar, elemen-elemen berada dalam urutan. Dict mereka hanya bergantung pada indeks.
Kode sederhana hanya untuk menjelaskannya dengan melakukan :
Cara untuk "mengonversi" daftar dalam suatu dikt adalah:
Kebalikannya adalah:
Pokoknya saya pikir lebih baik untuk mulai menghapus dari indeks yang lebih tinggi seperti yang Anda katakan.
sumber
Untuk menggeneralisasi komentar dari @sth . Penghapusan item dalam kelas apa pun, yang mengimplementasikan abc.MutableSequence , dan
list
khususnya, dilakukan melalui__delitem__
metode ajaib. Metode ini bekerja mirip dengan__getitem__
, artinya dapat menerima integer atau slice. Berikut ini sebuah contoh:Ini akan menampilkan
sumber
Mengimpornya hanya karena alasan ini mungkin berlebihan, tetapi jika Anda
pandas
tetap menggunakannya , maka solusinya sederhana dan langsung:sumber
Menghindari biaya penyortiran dan harus menyalin daftar secara eksplisit.
sumber
Bagaimana dengan salah satu dari ini (saya sangat baru di Python, tetapi tampaknya ok):
['Atlantik', 'Pasifik', 'India']
['Atlantik', 'Pasifik', 'India']
sumber
Tidak ada jawaban yang ditawarkan sejauh ini melakukan penghapusan di tempat pada O (n) pada panjang daftar untuk sejumlah indeks sewenang-wenang untuk dihapus, jadi inilah versi saya:
sumber
Anda dapat menggunakan hapus juga.
sumber
Saya menggabungkan semuanya menjadi
list_diff
fungsi yang hanya mengambil dua daftar sebagai input dan mengembalikan perbedaannya, sambil mempertahankan urutan asli dari daftar pertama.Penggunaan sampel:
sumber