Diberikan kamus { k1: v1, k2: v2 ... }
saya ingin mendapatkan { k1: f(v1), k2: f(v2) ... }
asalkan saya melewati suatu fungsi f
.
Apakah ada fungsi bawaan seperti itu? Atau harus saya lakukan
dict([(k, f(v)) for (k, v) in my_dictionary.iteritems()])
Idealnya saya hanya menulis
my_dictionary.map_values(f)
atau
my_dictionary.mutate_values_with(f)
Artinya, tidak masalah bagi saya jika kamus asli dimutasi atau salinan dibuat.
python
dictionary
map-function
Tarrasch
sumber
sumber
dict((k, f(v)) for k, v in mydict.iteritems())
, yaitu tanpa tanda kurung, yang akan mencegah pembuatan daftar perantara melalui generator.Jawaban:
Tidak ada fungsi seperti itu; cara termudah untuk melakukan ini adalah dengan menggunakan pemahaman dict:
Dalam python 2.7, gunakan
.iteritems()
metode alih-alih.items()
untuk menghemat memori. Sintaks pemahaman dikt tidak diperkenalkan sampai python 2.7.Perhatikan bahwa tidak ada metode seperti itu pada daftar juga; Anda harus menggunakan pemahaman daftar atau
map()
fungsinya.Dengan demikian, Anda juga dapat menggunakan
map()
fungsi untuk memproses dict Anda:tapi itu tidak bisa dibaca, sungguh.
sumber
dict(zip(a, map(f, a.values())))
sedikit lebih pendek, tetapi saya harus berpikir tentang apa yang dilakukannya, dan mengingatkan diri sendiri bahwa ya, kunci dan nilai diulang dalam urutan yang sama jika dikt tidak berubah. Saya tidak perlu berpikir sama sekali tentang apa yang diktekan diktcomp, dan jadi itu jawaban yang tepat.my_dictionary.__getitem__
panggilan kali .lambda (k,v): (k, f(v))
harus ditulis ulang menjadi sesuatu sepertilambda k_v: (k_v[0], f(k_v[1]))
Toolz ini bagus untuk jenis logika sederhana namun berulang ini.
http://toolz.readthedocs.org/en/latest/api.html#toolz.dicttoolz.valmap
Membuat Anda tepat di tempat yang Anda inginkan.
sumber
Anda dapat melakukan ini di tempat, daripada membuat dict baru, yang mungkin lebih disukai untuk kamus besar (jika Anda tidak memerlukan salinan).
hasil
my_dictionary
mengandung:sumber
mapdict
menjadimutate_values_with
atau sesuatu agar jelas bahwa Anda menulis ulang dikt! :)zip(d.keys(), d.values())
berfungsi untuk lebih banyak versi daripadaiteritems()
{k:f(v) for k,v in iter(d.items())}
Karena PEP-0469 yang mengubah nama iteritems () menjadi items () dan PEP-3113 yang menghapus parameter Tuple membongkar , dengan Python 3.x Anda harus menulis Martijn Pieters ♦ jawab seperti ini:
sumber
Sementara jawaban asli saya melewatkan intinya (dengan mencoba memecahkan masalah ini dengan solusi untuk mengakses kunci di pabrik defaultdict ), saya telah mengolahnya untuk mengusulkan solusi aktual untuk pertanyaan ini.
Ini dia:
Pemakaian:
Idenya adalah untuk membuat subklas dari dikt asli untuk memberikan fungsionalitas yang diinginkan: "memetakan" fungsi di atas semua nilai.
Titik plus adalah bahwa kamus ini dapat digunakan untuk menyimpan data asli seolah-olah itu adalah
dict
, sambil mengubah data apa pun berdasarkan permintaan dengan panggilan balik.Tentu saja, silakan beri nama kelas dan fungsi seperti yang Anda inginkan (nama yang dipilih dalam jawaban ini terinspirasi oleh
array_walk()
fungsi PHP ).Catatan: Baik
try
-except
blok maupunreturn
pernyataan wajib untuk fungsi, mereka ada di sana untuk lebih meniru perilaku PHParray_walk
.sumber
__missing__
metode ini tidak akan dipanggil untuk kunci yang ada, yang ingin kita ubah, kecuali metode pabrik yang lewat menggunakan entah bagaimana dict sebagai fallback, tetapi karena itu bukan bagian dari contoh penggunaan, Saya menganggap ini sebagai jawaban yang tidak memuaskan untuk masalah yang dihadapi.Given a dictionary { k1: v1, k2: v2 ... } ...
. Artinya, Anda sudah memilikidict
untuk memulai dengan ..{v1: f(v1), v2: f(v2), ...}
diberikan[v1, v2, ...]
, dan tidak diberi dict. Saya akan mengedit jawaban saya untuk memperbaikinya.Untuk menghindari pengindeksan dari dalam lambda, seperti:
Anda juga dapat melakukan:
sumber
lambda(k,v)
tidak akan berfungsi. Lihat stackoverflow.com/questions/21892989/...Baru saja menemukan kasus penggunaan ini. Saya menerapkan jawaban gens , menambahkan pendekatan rekursif untuk menangani nilai-nilai yang juga merupakan dikte:
Ini bisa berguna ketika berhadapan dengan file json atau yaml yang menyandikan string sebagai byte dalam Python 2
sumber