Хотя мой первоначальный ответ упустил из виду (пытаясь решить эту проблему с помощью решения Доступ к ключу в фабрике defaultdict ), я переработал его, чтобы предложить реальное решение для настоящего вопроса.
Вот:
class walkableDict(dict):
def walk(self, callback):
try:
for key in self:
self[key] = callback(self[key])
except TypeError:
return False
return True
Использование:
>>> d = walkableDict({ k1: v1, k2: v2 ... })
>>> d.walk(f)
Идея состоит в том, чтобы создать подкласс исходного диктанта, чтобы придать ему желаемую функциональность: «сопоставить» функцию со всеми значениями.
Плюсом является то, что этот словарь можно использовать для хранения исходных данных, как если бы они были dict
, при преобразовании любых данных по запросу с помощью обратного вызова.
Конечно, не стесняйтесь называть класс и функцию так, как вы хотите (имя, выбранное в этом ответе, вдохновлено array_walk()
функцией PHP ).
Примечание: ни блок try
-, except
ни return
операторы не являются обязательными для функциональности, они предназначены для дальнейшего имитации поведения PHP array_walk
.
dict((k, f(v)) for k, v in mydict.iteritems())
, то есть без квадратных скобок, который предотвратил бы создание промежуточного списка через генератор.