Orijinal cevabım bu noktayı kaçırmış olsa da (bu sorunu defaultdict fabrikasındaki Access anahtarına çözüm ile çözmeye çalışarak ), mevcut soruya gerçek bir çözüm önermek için yeniden çalıştım.
İşte burada:
class walkableDict(dict):
def walk(self, callback):
try:
for key in self:
self[key] = callback(self[key])
except TypeError:
return False
return True
Kullanımı:
>>> d = walkableDict({ k1: v1, k2: v2 ... })
>>> d.walk(f)
Fikir, orijinal diksele istenen işlevselliği vermek için alt sınıfı sınıflandırmaktır: bir işlevi tüm değerler üzerinde "eşleme".
Artı nokta, bu sözlüğün orijinal verileri olduğu gibi depolamak için kullanılabilirken dict
, talep üzerine herhangi bir veriyi geri arama ile dönüştürmek için kullanılabilir.
Tabii ki, sınıfı ve işlevi istediğiniz gibi adlandırmaktan çekinmeyin (bu cevapta seçilen ad PHP'nin array_walk()
işlevinden esinlenmiştir ).
Not: Ne try
- except
bloğu ne de return
ifadeler işlevsellik için zorunlu değildir, PHP'lerin davranışlarını daha fazla taklit etmek için oradadırlar array_walk
.
dict((k, f(v)) for k, v in mydict.iteritems())
, yani köşeli parantezler olmadan, bir jeneratör aracılığıyla bir ara liste oluşturulmasını engelleyecektir.