Ini adalah sumber yang saya mulai.
Daftarku
L = [0, 23, 234, 89, None, 0, 35, 9]
Ketika saya menjalankan ini:
L = filter(None, L)
Saya mendapatkan hasil ini
[23, 234, 89, 35, 9]
Tapi ini bukan yang saya butuhkan, yang saya butuhkan adalah:
[0, 23, 234, 89, 0, 35, 9]
Karena saya sedang menghitung persentil dari data dan 0 membuat banyak perbedaan.
Bagaimana cara menghapus nilai None dari daftar tanpa menghapus nilai 0?
filter
:filter(lambda x: x is not None, L)
- Anda bisa menghilangkanlambda
penggunaanpartial
danoperator.is_not
saya pikir, tapi mungkin tidak sepadan karena list-comp jauh lebih bersih.is_not
ada! Saya pikir itu hanyais_
, saya akan menambahkannya hanya untuk bersenangis_not
ada dannot_in
tidak ada. Saya benar-benar berpikir bahwa itunot_in
harus diubah menjadi metode ajaib__not_contains__
... lihat pertanyaan yang saya ajukan beberapa waktu lalu dan komentar yang saya buat untuk seorang penjawab ... dan masih tidak merasa seperti itu diselesaikan.filterfalse
atau sesuatu tergantung pada kasus penggunaanx > y
tidak menyiratkannot x <= y
dalam python karena Anda dapat melakukan apa pun di ,__lt__
dan__le__
mengapa harusx not in y
menyiratkannot x in y
(terutama karenanot in
memiliki bytecode sendiri?)FWIW, Python 3 membuat masalah ini mudah:
Di Python 2, Anda akan menggunakan pemahaman daftar sebagai gantinya:
sumber
__ne__
seperti itu sebagai lawan daripartial
danne
?operator
modul ini.__ne__
?x != y
internal memanggil dix.__ne__(y)
mana ne adalah "tidak sama". Jadi,None.__ne__
adalah metode terikat yang mengembalikan Benar ketika dipanggil dengan nilai apa pun selain Tidak Ada . Misalnya,bm = None.__ne__
dipanggil denganbm(10)
pengembalian NotImplemented yang sebagai nilai benar, danbm(None)
mengembalikan False .Menggunakan daftar pemahaman ini dapat dilakukan sebagai berikut:
Nilai l adalah:
sumber
Untuk Python 2.7 (Lihat jawaban Raymond, untuk Python 3 yang setara):
Ingin tahu apakah sesuatu "bukan Tidak Ada" begitu umum di python (dan bahasa OO lainnya), sehingga dalam Common.py saya (yang saya impor ke setiap modul dengan "from Common import *"), saya menyertakan baris-baris ini:
Kemudian untuk menghapus Tidak ada elemen dari daftar, cukup lakukan:
Saya menemukan ini lebih mudah dibaca, daripada pemahaman daftar terkait (yang menunjukkan Raymond, sebagai versi Python 2-nya).
sumber
partial(is_not, None)
solusi ini. Saya percaya ini akan lebih lambat (walaupun itu tidak terlalu penting). Tetapi dengan beberapa impor modul python, tidak perlu untuk fungsi yang didefinisikan khusus dalam kasus ini@jamylak jawaban cukup bagus, namun jika Anda tidak ingin mengimpor beberapa modul hanya untuk melakukan tugas sederhana ini, tulis sendiri
lambda
di tempat:sumber
[x for x in L if x is not None]
kode lain hanya tambahan saya secara eksplisit menyatakan saya tidak akan merekomendasikanIterasi vs Space , penggunaan bisa menjadi masalah. Dalam situasi yang berbeda, profil mungkin menunjukkan menjadi "lebih cepat" dan / atau "kurang memori" intensif.
The pertama pendekatan (seperti yang juga disarankan oleh @jamylak , @Raymond Hettinger , dan @Dipto ) menciptakan duplikat daftar di memori, yang bisa mahal untuk daftar besar dengan beberapa
None
entri.The kedua pendekatan melewati daftar sekali, dan sekali lagi setiap kali sampai
None
tercapai. Ini bisa kurang intensif memori, dan daftar akan semakin kecil seiring berjalannya waktu. Penurunan ukuran daftar bisa mempercepat untuk banyakNone
entri di depan, tetapi kasus terburuk adalah jika banyakNone
entri di belakang.Paralelisasi dan teknik in-place adalah pendekatan lain, tetapi masing-masing memiliki komplikasinya sendiri dalam Python. Mengetahui data dan kasus penggunaan runtime, serta membuat profil program adalah tempat untuk memulai operasi intensif atau data besar.
Memilih pendekatan mana pun mungkin tidak masalah dalam situasi umum. Itu menjadi lebih dari preferensi notasi. Bahkan, dalam keadaan yang tidak biasa itu,
numpy
ataucython
mungkin merupakan alternatif yang bermanfaat daripada mencoba untuk mengoptimalkan mikro Python.sumber
L.count(None)
dan kemudian Anda menelepon.remove(None)
beberapa kali yang membuat iniO(N^2)
. Situasi yang Anda coba selesaikan tidak boleh ditangani dengan cara ini, data harus direstrukturisasi. ke dalam Database atau file sebagai gantinya jika itu intensif memori.O(n^2)
hanya ketika seluruh daftarNone
.numpy
akan dapat menangani jenis operasi ini dengan cara yang lebih optimalnumpy
dalam beberapa tahun terakhir, tetapi itu adalah keterampilan yang terpisah. JikaL
dipakai sebagainumpy.array
pengganti Pythonlist
, makaL = L[L != numpy.array(None)]
(stackoverflow.com/a/25255015/3003133) mungkin lebih baik daripada keduanya, tapi saya tidak tahu detail implementasi untuk memproses vs memori di bawahnya. Setidaknya membuat array panjang boolean duplikat untuk topeng. Sintaks perbandingan di dalam operator akses (indeks), dengan cara itu, baru bagi saya. Diskusi ini juga menarik perhatian sayadtype=object
.sumber
Jika semuanya daftar daftar, Anda dapat mengubah jawaban sir @ Raymond
L = [ [None], [123], [None], [151] ] no_none_val = list(filter(None.__ne__, [x[0] for x in L] ) )
untuk python 2no_none_val = [x[0] for x in L if x[0] is not None] """ Both returns [123, 151]"""
<< list_indice [0] untuk variabel dalam Daftar jika variabel tidak ada >>
sumber
Katakanlah daftarnya seperti di bawah ini
Ini hanya akan mengembalikan barang-barang yang
bool(item) is True
Ini setara dengan
Untuk hanya memfilter Tidak Ada:
Setara dengan:
Untuk mendapatkan semua item yang dievaluasi menjadi False
sumber