Jika Anda benar-benar perlu mengubah kamus asli:
empty_keys = [k for k,v in metadata.iteritems() if not v]
for k in empty_keys:
del metadata[k]
Perhatikan bahwa kita harus membuat daftar kunci kosong karena kita tidak dapat mengubah kamus saat mengulanginya (seperti yang mungkin telah Anda ketahui). Ini lebih murah (dari segi memori) daripada membuat kamus baru, kecuali jika ada banyak entri dengan nilai kosong.
nneonneo
sumber
sumber
.iteritems()
dengan.items()
, pertama tidak bekerja lagi dalam versi Python terbaru.Jawaban:
Solusi BrenBarn ideal (dan pythonic, saya bisa menambahkan). Berikut adalah solusi lain (fp), namun:
sumber
Jika Anda menginginkan pendekatan berfitur lengkap namun ringkas untuk menangani struktur data dunia nyata yang sering bersarang, dan bahkan dapat berisi siklus, saya sarankan untuk melihat utilitas pemetaan ulang dari paket utilitas boltons .
Setelah
pip install boltons
atau menyalin iterutils.py ke dalam proyek Anda, lakukan saja:Halaman ini memiliki lebih banyak contoh, termasuk yang bekerja dengan objek yang jauh lebih besar dari API Github.
Ini murni-Python, jadi berfungsi di mana-mana, dan sepenuhnya diuji dengan Python 2.7 dan 3.3+. Yang terbaik dari semuanya, saya menulisnya persis untuk kasus seperti ini, jadi jika Anda menemukan kasus yang tidak tertangani, Anda dapat mengganggu saya untuk memperbaikinya di sini .
sumber
Berdasarkan solusi Ryan , jika Anda juga memiliki daftar dan kamus bertingkat:
Untuk Python 2:
Untuk Python 3:
sumber
d = { "things": [{ "name": "" }] }
Jika Anda memiliki kamus bertingkat, dan Anda ingin ini berfungsi bahkan untuk sub-elemen kosong, Anda dapat menggunakan varian rekursif dari saran BrenBarn:
sumber
items()
alih-alihiteritems()
untuk Python 3Jawaban Cepat (TL; DR)
Contoh01
Jawaban Terperinci
Masalah
Larutan
Jebakan
Contoh alternatif
Contoh02
Lihat juga
sumber
Untuk python 3
sumber
Membangun jawaban dari patriciasz dan nneonneo , dan memperhitungkan kemungkinan bahwa Anda mungkin ingin menghapus kunci yang hanya memiliki hal-hal palsu tertentu (misalnya
''
) tetapi tidak yang lain (misalnya0
), atau mungkin Anda bahkan ingin memasukkan beberapa hal yang benar (misalnya'SPAM'
) , lalu Anda dapat membuat daftar target yang sangat spesifik:Sayangnya, ini tidak cukup berhasil, karena misalnya
0 in unwanted
mengevaluasi keTrue
. Kita perlu membedakan antara0
dan hal-hal palsu lainnya, jadi kita harus menggunakanis
:... mengevaluasi ke
False
.Sekarang gunakan untuk
del
hal yang tidak diinginkan:Jika Anda menginginkan kamus baru, alih-alih mengubah
metadata
di tempat:sumber
[]
Saya membaca semua balasan di utas ini dan beberapa juga merujuk ke utas ini: Hapus dicts kosong di kamus bersarang dengan fungsi rekursif
Saya awalnya menggunakan solusi di sini dan itu berfungsi dengan baik:
Percobaan 1: Terlalu Panas (tidak berkinerja baik atau tidak terbukti masa depan) :
Tetapi beberapa masalah kinerja dan kompatibilitas diangkat di dunia Python 2.7:
isinstance
sebagai gantitype
for
lingkaran untuk efisiensiitems
bukaniteritems
Percobaan 2: Terlalu Dingin (Kurang Memoisasi) :
DOH! Ini tidak rekursif dan sama sekali tidak memoizant.
Percobaan 3: Just Right (sejauh ini) :
sumber
Dict dicampur dengan Array
if isinstance(v, list):
, yang menghapus daftar menggunakanscrub_dict(d)
implementasi asli .sumber
Cara alternatif untuk melakukan ini adalah dengan menggunakan pemahaman kamus. Ini harus kompatibel dengan
2.7+
sumber
Berikut adalah opsi jika Anda menggunakan
pandas
:sumber
Beberapa Metode yang disebutkan di atas mengabaikan jika ada bilangan bulat dan mengambang dengan nilai 0 & 0,0
Jika seseorang ingin menghindari hal di atas dapat menggunakan kode di bawah ini (menghapus string kosong dan nilai None dari kamus bersarang dan daftar bersarang):
sumber
"Karena saat ini saya juga menulis aplikasi desktop untuk pekerjaan saya dengan Python, saya menemukan di aplikasi entri data ketika ada banyak entri dan ada beberapa yang tidak wajib sehingga pengguna dapat membiarkannya kosong, untuk tujuan validasi, mudah untuk diambil semua entri dan kemudian buang kunci kosong atau nilai kamus Jadi kode saya di atas menunjukkan bagaimana kita dapat dengan mudah mengeluarkannya, menggunakan pemahaman kamus dan menyimpan elemen nilai kamus yang tidak kosong.Saya menggunakan Python 3.8.3
sumber
Beberapa pembandingan:
1. Pemahaman daftar menciptakan dikt
2. Pemahaman daftar membuat ulang dict menggunakan dict ()
3. Loop dan menghapus kunci jika v adalah None
jadi loop dan delete adalah yang tercepat di 160ns, pemahaman daftar setengah lambat di ~ 375ns dan dengan panggilan ke
dict()
setengah lambat lagi ~ 680ns.Membungkus 3 menjadi fungsi membawanya kembali ke sekitar 275ns. Juga bagi saya PyPy sekitar dua kali lebih cepat dari python neet.
sumber
list(dic.items())
di py 3. Dict pemahaman ftw lalu? del masih tampak lebih cepat untuk rasio rendah nilai Null / kosong. Saya kira membangun daftar itu sama buruknya dengan konsumsi memori daripada hanya membuat ulang dict.