Trong khi câu trả lời ban đầu của tôi bị mất điểm (bằng cách cố gắng giải quyết vấn đề này bằng giải pháp cho khóa Truy cập trong nhà máy của defaultdict ), tôi đã làm lại nó để đề xuất một giải pháp thực tế cho câu hỏi hiện tại.
Đây là:
class walkableDict(dict):
def walk(self, callback):
try:
for key in self:
self[key] = callback(self[key])
except TypeError:
return False
return True
Sử dụng:
>>> d = walkableDict({ k1: v1, k2: v2 ... })
>>> d.walk(f)
Ý tưởng là phân lớp dict gốc để cung cấp cho nó chức năng mong muốn: "ánh xạ" một hàm trên tất cả các giá trị.
Điểm cộng là từ điển này có thể được sử dụng để lưu trữ dữ liệu gốc như thể nó là một dict
, trong khi chuyển đổi bất kỳ dữ liệu nào theo yêu cầu với một cuộc gọi lại.
Tất nhiên, hãy thoải mái đặt tên cho lớp và hàm theo cách bạn muốn (tên được chọn trong câu trả lời này được lấy cảm hứng từ array_walk()
chức năng của PHP ).
Lưu ý: Cả khối try
- except
và return
câu lệnh đều không bắt buộc đối với chức năng, chúng ở đó để bắt chước thêm hành vi của PHP array_walk
.
dict((k, f(v)) for k, v in mydict.iteritems())
, tức là không có dấu ngoặc vuông, điều đó sẽ ngăn việc tạo một danh sách trung gian thông qua một trình tạo.