[python] Python : defaultdict를 dict로 변환

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

단지 약간 다른 행동에서 누락되는 키 액세스를 시도 할 때 – 통상을 올릴 것이다 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

그러나 대부분의 경우 이것은 문제의 가치가 없습니다.


답변

예를 들어 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에 클래스 나 함수를 저장할 의도가 없다면 문제가되지 않습니다.


답변

당신도 재귀를 변환하는 재귀 버전을 원하는 경우 defaultdictA와 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)


답변