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로 변환하는 또 다른 간단한 방법은 json
module 을 사용하는 것입니다.
import json
data = json.loads(json.dumps(data))
물론 defaultdict에 포함 된 값은 json 지원 데이터 유형으로 제한되어야하지만 dict에 클래스 나 함수를 저장할 의도가 없다면 문제가되지 않습니다.
답변
당신도 재귀를 변환하는 재귀 버전을 원하는 경우 defaultdict
A와 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)