Saya punya dict
yang memiliki banyak entri. Saya hanya tertarik pada beberapa dari mereka. Apakah ada cara mudah untuk memangkas yang lainnya?
python
dictionary
Mpen
sumber
sumber
Jawaban:
Membangun dikte baru:
Menggunakan pemahaman kamus.
Jika Anda menggunakan versi yang tidak memilikinya (yaitu Python 2.6 dan sebelumnya), buatlah
dict((your_key, old_dict[your_key]) for ...)
. Itu sama, meskipun lebih jelek.Perhatikan bahwa ini, tidak seperti versi jnnnnn, memiliki kinerja yang stabil (hanya bergantung pada jumlah tombol_Anda) untuk
old_dict
ukuran berapa saja. Baik dari segi kecepatan maupun memori. Karena ini adalah ekspresi generator, ia memproses satu item pada satu waktu, dan itu tidak melihat semua item old_dict.Menghapus semua yang ada di tempat:
sumber
old_dict
mengindikasikan bug di tempat lain, dan dalam hal ini saya sangat suka kesalahan untuk hasil diam-diam salah.Pemahaman dikt sedikit lebih elegan:
sumber
mydict.iteritems()
..items()
membuat daftar lain.Berikut ini contoh dalam python 2.6:
Bagian penyaringan adalah
if
pernyataan.Metode ini lebih lambat daripada jawaban delnan jika Anda hanya ingin memilih beberapa kunci yang sangat banyak.
sumber
if key in ('x','y','z')
kurasa.Anda dapat melakukannya dengan proyek fungsi dari saya funcy perpustakaan:
Lihat juga pada select_keys .
sumber
Kode 1:
Kode 2:
Kode 3:
Semua bagian dari kinerja kode diukur dengan timeit menggunakan angka = 1000, dan dikumpulkan 1000 kali untuk setiap bagian kode.
Untuk python 3.6 kinerja tiga cara kunci dict filter hampir sama. Untuk python 2.7 kode 3 sedikit lebih cepat.
sumber
Lambda satu liner ini harus bekerja:
Ini sebuah contoh:
Ini adalah pemahaman daftar dasar yang berulang pada kunci dikte Anda (i in x) dan menampilkan daftar pasangan tuple (kunci, nilai) jika kunci tersebut tinggal dalam daftar kunci yang Anda inginkan (y). Dict () membungkus semuanya menjadi output sebagai objek dict.
sumber
set
untukwanted_keys
, tetapi sebaliknya terlihat bagus.dictfilt({'x':['wefwef',52],'y':['iuefiuef','efefij'],'z':['oiejf','iejf']}, ('x','z'))
:, ia kembali{'x': ['wefwef', 52], 'z': ['oiejf', 'iejf']}
seperti yang dimaksudkan.dict={'0':[1,3], '1':[0,2,4], '2':[1,4]}
dan hasilnya adalah{}
, yang saya anggap sebagai dict kosong.foo = {'0':[1,3], '1':[0,2,4], '2':[1,4]}; dictfilt(foo,('0','2'))
saya mendapatkan:{'0': [1, 3], '2': [1, 4]}
yang merupakan hasil yang diinginkanDiberikan kamus asli Anda
orig
dan sekumpulan entri yang Anda minatikeys
:yang tidak sebaik jawaban delnan, tetapi harus bekerja di setiap versi Python yang menarik. Namun, ini rapuh untuk setiap elemen yang
keys
ada di kamus asli Anda.sumber
Berdasarkan jawaban yang diterima oleh delnan.
Bagaimana jika salah satu kunci yang Anda inginkan tidak ada di old_dict? Solusi delnan akan melempar pengecualian KeyError yang dapat Anda tangkap. Jika bukan itu yang Anda butuhkan, mungkin Anda ingin:
hanya sertakan kunci yang ada di old_dict dan kumpulan want_keys Anda.
memiliki nilai default untuk kunci yang tidak disetel di old_dict.
sumber
{k: old_dict.get(k, default) for k in ...}
Fungsi ini akan melakukan trik:
Sama seperti versi delnan, kamus ini menggunakan pemahaman kamus dan memiliki kinerja yang stabil untuk kamus besar (hanya bergantung pada jumlah kunci yang Anda izinkan, dan bukan jumlah total kunci dalam kamus).
Dan seperti versi MyGGan, yang ini memungkinkan daftar kunci Anda untuk memasukkan kunci yang mungkin tidak ada dalam kamus.
Dan sebagai bonus, inilah kebalikannya, di mana Anda dapat membuat kamus dengan mengecualikan kunci tertentu di aslinya:
Perhatikan bahwa tidak seperti versi delnan, operasi tidak dilakukan di tempat, sehingga kinerjanya terkait dengan jumlah kunci dalam kamus. Namun, keuntungannya adalah bahwa fungsi ini tidak akan mengubah kamus yang disediakan.
Sunting: Menambahkan fungsi terpisah untuk mengecualikan kunci tertentu dari dikt.
sumber
keys
dengan segala jenis iterable, seperti set apa yang diterima.invert
menyiratkan bahwakeys
argumen itu dipertahankan, atau bahwakeys
argumen itu ditolak?", Berapa banyak dari mereka akan setuju?Jika kita ingin membuat kamus baru dengan kunci yang dipilih dihapus, kita dapat menggunakan pemahaman kamus
Misalnya:
sumber
Pilihan lain:
Tapi Anda mendapatkan
list
(Python 2) atau iterator (Python 3) dikembalikan olehfilter()
, bukan adict
.sumber
filtered
didict
dan Anda mendapatkan kembali kamus!Bentuk pendek:
Seperti sebagian besar jawaban menyarankan untuk menjaga keringkasan kita harus membuat objek duplikat baik itu a
list
ataudict
. Yang ini membuat membuang-buanglist
tetapi menghapus kunci aslinyadict
.sumber
Berikut adalah metode sederhana lain yang digunakan
del
dalam satu liner:e_keys
adalah daftar kunci yang akan dikecualikan. Ini akan memperbarui dict Anda daripada memberi Anda yang baru.Jika Anda ingin keluaran baru, buat salinan salinan sebelum menghapus:
sumber
Anda dapat menggunakan
python-benedict
, ini adalah subclass dict.Instalasi:
pip install python-benedict
Ini open-source di GitHub: https://github.com/fabiocaccamo/python-benedict
Penafian: Saya penulis perpustakaan ini.
sumber