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
단지 약간 다른 행동에서 누락되는 키 액세스를 시도 할 때 - 통상을 올릴 것이다 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
당신을 위해 참조).
예를 들어 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)
defaultdict(lambda: defaultdict(int))
{k: dict(v) for k, v in foo.items()}
dict(number_to_letter)