ฉันจะแปลง defaultdict ได้อย่างไร
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
เป็นคำสั่งทั่วไป?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
    ฉันจะแปลง defaultdict ได้อย่างไร
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
เป็นคำสั่งทั่วไป?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
    คำตอบ:
คุณสามารถโทรdict:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
แต่จำไว้ว่า defaultdict คือ dict:
>>> isinstance(a, dict)
True
เพียงแค่มีพฤติกรรมที่แตกต่างกันเล็กน้อยเมื่อคุณพยายามเข้าถึงคีย์ที่หายไปซึ่งโดยปกติจะเพิ่ม a KeyError- default_factoryถูกเรียกแทน:
>>> a.default_factory
<type 'list'>
นั่นคือสิ่งที่คุณเห็นเมื่อคุณ print aก่อนที่ด้านข้อมูลของพจนานุกรมจะปรากฏขึ้น
ดังนั้นเคล็ดลับอีกประการหนึ่งที่จะทำให้พฤติกรรมที่เหมือนเผด็จการกลับมามากขึ้นโดยไม่ต้องสร้างวัตถุใหม่คือการรีเซ็ตdefault_factory:
>>> a.default_factory = None
>>> a[4].append(10)
Traceback (most recent call last):
  File "<ipython-input-6-0721ca19bee1>", line 1, in <module>
    a[4].append(10)
KeyError: 4
แต่ส่วนใหญ่แล้วสิ่งนี้ไม่คุ้มกับปัญหา
default_factoryหรือไม่? ฉันไม่รู้ว่าเกิดอะไรขึ้น ขออภัย.
                    default_factory- ที่ฟังก์ชั่นที่คุณผ่านไปเมื่อคุณทำdefaultdictในสถานที่แรกเหมือนหรือdefaultdict(int) defaultdict(list)เมื่อใดก็ตามที่คุณพยายามค้นหาคีย์ในพจนานุกรมa['3']เช่นในพจนานุกรมปกติคุณจะได้รับค่านั้นหรือมีKeyErrorข้อยกเว้น (เช่นข้อผิดพลาดที่บอกคุณว่าไม่พบคีย์นั้น) แต่ในทางกลับdefaultdictกันจะเรียกใช้default_factoryฟังก์ชันเพื่อสร้างค่าเริ่มต้นใหม่ (นั่นคือ "ค่าเริ่มต้น" ในdefaultdict) ให้กับคุณ
                    pickle(สำหรับการบันทึกวัตถุหลามไปยังแฟ้ม) ไม่สามารถจัดการdefaultdictในหลายกรณี 
                    หาก defaultdict ของคุณถูกกำหนดแบบวนซ้ำตัวอย่างเช่น:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
อีกวิธีง่ายๆในการแปลง defaultdict กลับเป็น dict คือการใช้jsonmodule
import json
data = json.loads(json.dumps(data))
และแน่นอนว่าค่าที่อยู่ใน defaultdict ของคุณจะต้อง จำกัด เฉพาะประเภทข้อมูลที่รองรับโดย json แต่ก็ไม่ควรเป็นปัญหาหากคุณไม่ได้ตั้งใจที่จะจัดเก็บคลาสหรือฟังก์ชันไว้ใน dict
ถ้าคุณยังต้องการรุ่น recursive สำหรับการแปลง recursive defaultdictไปdictคุณสามารถลองต่อไปนี้:
#! /usr/bin/env python3
from collections import defaultdict
def ddict():
    return defaultdict(ddict)
def ddict2dict(d):
    for k, v in d.items():
        if isinstance(v, dict):
            d[k] = ddict2dict(v)
    return dict(d)
myddict = ddict()
myddict["a"]["b"]["c"] = "value"
print(myddict)
mydict = ddict2dict(myddict)
print(mydict)
    defaultdict(lambda: defaultdict(int))):      {k: dict(v) for k, v in foo.items()}
                    
dict(number_to_letter)