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:
class walkableDict(dict):
def walk(self, callback):
try:
for key in self:
self[key] = callback(self[key])
except TypeError:
return False
return True
Pemakaian:
>>> d = walkableDict({ k1: v1, k2: v2 ... })
>>> d.walk(f)
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 maupun return
pernyataan wajib untuk fungsi, mereka ada di sana untuk lebih meniru perilaku PHP array_walk
.
dict((k, f(v)) for k, v in mydict.iteritems())
, yaitu tanpa tanda kurung, yang akan mencegah pembuatan daftar perantara melalui generator.