Si bien mi respuesta original perdió el punto (al tratar de resolver este problema con la solución para acceder a la clave en la fábrica de defaultdict ), la modifiqué para proponer una solución real a la presente pregunta.
Aquí está:
class walkableDict(dict):
def walk(self, callback):
try:
for key in self:
self[key] = callback(self[key])
except TypeError:
return False
return True
Uso:
>>> d = walkableDict({ k1: v1, k2: v2 ... })
>>> d.walk(f)
La idea es subclasificar el dict original para darle la funcionalidad deseada: "mapear" una función sobre todos los valores.
El punto a favor es que este diccionario se puede usar para almacenar los datos originales como si fuera un dict
, mientras se transforma cualquier dato a pedido con una devolución de llamada.
Por supuesto, siéntase libre de nombrar la clase y la función de la manera que desee (el nombre elegido en esta respuesta está inspirado en la array_walk()
función de PHP ).
Nota: Ni el bloque try
- except
ni las return
declaraciones son obligatorias para la funcionalidad, están ahí para imitar aún más el comportamiento de los PHP array_walk
.
dict((k, f(v)) for k, v in mydict.iteritems())
, es decir, sin los corchetes, que evitaría la creación de una lista intermedia a través de un generador.