ในขณะที่คำตอบเดิมของฉันพลาดจุดนี้ (โดยพยายามแก้ไขปัญหานี้ด้วยวิธีแก้ปัญหาการเข้าถึงคีย์ในโรงงานที่เป็น 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)
ความคิดคือ subclass ต้นฉบับ dict เพื่อให้การทำงานที่ต้องการ: "การทำแผนที่" ฟังก์ชั่นมากกว่าค่าทั้งหมด
จุดบวกคือพจนานุกรมนี้สามารถใช้ในการจัดเก็บข้อมูลต้นฉบับราวกับว่ามันเป็นdict
ในขณะที่การแปลงข้อมูลใด ๆ ตามคำขอด้วยการโทรกลับ
แน่นอนว่าอย่าลังเลที่จะตั้งชื่อคลาสและฟังก์ชั่นในแบบที่คุณต้องการ (ชื่อที่เลือกในคำตอบนี้ได้รับแรงบันดาลใจจากarray_walk()
ฟังก์ชั่นของ PHP )
หมายเหตุ: ทั้งtry
- except
บล็อกหรือreturn
งบมีผลบังคับใช้สำหรับการทำงานที่พวกเขาจะมีการเพิ่มเติมเลียนแบบพฤติกรรมของ array_walk
PHP
dict((k, f(v)) for k, v in mydict.iteritems())
คือไม่มีวงเล็บเหลี่ยมซึ่งจะป้องกันการสร้างรายการกลางผ่านตัวสร้าง