Хоча моя оригінальна відповідь пропустила суть (намагаючись вирішити цю проблему за допомогою рішення ключа доступу до фабрики за замовчуванням ), я переробив її, щоб запропонувати фактичне рішення цього питання.
Ось:
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
, одночасно перетворюючи будь-які дані за запитом із зворотним зв'язком.
Звичайно, не соромтесь називати клас та функцію так, як вам потрібно (ім'я, вибране в цій відповіді, натхнене функцією PHP array_walk()
).
Примітка: Ні блок try
-, except
ні return
оператори не є обов'язковими для функціональності, вони є там, щоб ще більше імітувати поведінку PHP array_walk
.
dict((k, f(v)) for k, v in mydict.iteritems())
, тобто без квадратних дужок, який би перешкоджав створенню проміжного списку через генератор.