Dalam Python remove()
akan menghapus nilai kemunculan pertama dalam daftar.
Bagaimana cara menghapus semua kemunculan suatu nilai dari daftar?
Inilah yang ada dalam pikiran saya:
>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]
Pendekatan fungsional:
Python 3.x
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]
atau
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter(lambda a: a != 2, x))
[1, 3, 3, 4]
Python 2.x
>>> x = [1,2,3,2,2,2,3,4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]
[y for y in x if y != 2]
__ne__
. Membandingkan dua nilai adalah proses yang jauh lebih kompleks dari sekadar menelepon__eq__
atau__ne__
salah satunya. Ini mungkin berfungsi dengan benar di sini karena Anda hanya membandingkan angka, tetapi dalam kasus umum itu tidak benar dan bug.Anda dapat menggunakan pemahaman daftar:
sumber
in
operator danremove
metode memindai seluruh daftar (hingga mereka menemukan kecocokan) sehingga Anda akhirnya memindai daftar beberapa kali dengan cara itu.Anda dapat menggunakan penugasan slice jika daftar asli harus diubah, sementara masih menggunakan pemahaman daftar yang efisien (atau ekspresi generator).
sumber
x = [ v for v in x if x != 2 ]
proposal, yang membuat daftar baru dan mengubah x untuk merujuk padanya, membuat daftar asli tidak tersentuh.Mengulangi solusi posting pertama dengan cara yang lebih abstrak:
sumber
x = [1] * 10000 + [2] * 1000
. Badan loop dijalankan 1000 kali dan .remove () harus melewati 10000 elemen setiap kali dijalankan. Baunya seperti O (n * n) bagi saya tetapi tidak ada bukti. Saya pikir buktinya adalah mengasumsikan bahwa jumlah 2s dalam daftar sebanding dengan panjangnya. Faktor proporsionalitas itu kemudian menghilang dalam notasi O-besar. Namun, kasus terbaik hanya dari jumlah konstan 2s dalam daftar, bukan O (n ^ 2), hanya O (2n) yang merupakan O (n).Lihat solusi sederhana
Ini akan mengembalikan daftar yang memiliki semua elemen
x
tanpa2
sumber
Semua jawaban di atas (selain dari Martin Andersson) membuat daftar baru tanpa item yang diinginkan, daripada menghapus item dari daftar asli.
Ini bisa menjadi penting jika Anda memiliki referensi lain ke daftar yang berkeliaran.
Untuk mengubah daftar di tempat, gunakan metode seperti ini
Sejauh menyangkut kecepatan, hasil pada laptop saya (semua ada di daftar entri 5000 dengan 1000 entri dihapus)
Jadi loop .Hapus sekitar 100x lebih lambat ........ Hmmm, mungkin pendekatan yang berbeda diperlukan. Yang tercepat yang saya temukan adalah menggunakan pemahaman daftar, tetapi kemudian mengganti konten dari daftar asli.
sumber
def remove_all(x, l): return [y for y in l if y != x]
lalul = remove_all(3,l)
kamu bisa melakukan ini
sumber
Dengan biaya keterbacaan, saya pikir versi ini sedikit lebih cepat karena tidak memaksa sementara untuk memeriksa ulang daftar, sehingga melakukan pekerjaan yang persis sama harus dilakukan:
sumber
Pendekatan dan pengaturan waktu yang kasar terhadap daftar / array dengan 1.000.000 elemen:
Pengaturan waktu:
Kesimpulan: numpy 27 kali lebih cepat (di notebook saya) dibandingkan dengan pendekatan daftar pemahaman
PS jika Anda ingin mengonversi daftar Python biasa Anda
lst
menjadi array numpy:Mendirikan:
Memeriksa:
sumber
sumber
Untuk menghapus semua kejadian duplikat dan meninggalkan satu di daftar:
Berikut adalah fungsi yang saya gunakan untuk Project Euler:
sumber
Saya percaya ini mungkin lebih cepat daripada cara lain jika Anda tidak peduli tentang urutan daftar, jika Anda berhati-hati tentang pesanan akhir, simpan indeks dari aslinya dan gunakan itu.
sumber
Jauh lebih sederhana, saya percaya.
sumber
Membiarkan
Solusi paling sederhana dan efisien seperti yang sudah diposting sebelumnya adalah
Kemungkinan lain yang harus menggunakan memori lebih sedikit tetapi lebih lambat adalah
Waktu hasil untuk daftar panjang 1000 dan 100000 dengan entri yang cocok 10%: 0,16 vs 0,25 ms, dan 23 vs 123 ms.
sumber
Hapus semua kemunculan nilai dari daftar Python
Hasil:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
Kalau tidak,
Hasil:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
sumber
Jika Anda tidak memiliki built-in
filter
atau tidak ingin menggunakan ruang tambahan dan Anda memerlukan solusi linier ...sumber
['Halo Dunia']
sumber
Saya hanya melakukan ini untuk daftar. Saya hanyalah seorang pemula. Seorang programmer yang sedikit lebih maju pasti dapat menulis fungsi seperti ini.
sumber
Kami juga dapat melakukan di tempat menghapus semua menggunakan salah satu
del
ataupop
:Sekarang untuk efisiensi:
Seperti yang kita lihat bahwa versi in-place
remove_values_from_list()
tidak memerlukan memori tambahan, tetapi itu membutuhkan lebih banyak waktu untuk berjalan:sumber
Tidak ada yang memposting jawaban optimal untuk kompleksitas waktu dan ruang, jadi saya pikir saya akan mencobanya. Berikut adalah solusi yang menghapus semua kemunculan dari nilai tertentu tanpa membuat array baru dan pada kompleksitas waktu yang efisien. Kekurangannya adalah bahwa unsur-unsur tidak menjaga ketertiban .
Kompleksitas waktu: O (n)
Kompleksitas ruang tambahan: O (1)
sumber
Soal kecepatan!
sumber
Hanya dengan Python 3
sumber
Ada apa dengan:
Menggunakan anaconda
sumber