본문 바로가기
코딩 연습/코딩배우기

파이썬 사전 타입 OrderedDict()와 dict() 차이점, 그리고 변환

by good4me 2022. 1. 20.

goodthings4me.tistory.com

파이썬 OrderedDict()는 순서 있는 딕셔너리이다. 순서가 없는 dict()에 3.6 버전에서부터 순서를 부여하긴 했으나 자료 호환성 측면과 순서가 중요한 경우, OrderedDict()를 사용한다. 그런데 문제는 중첩(nested)된 OrderedDict 형태였다. 

 

 

파이썬 OrderedDict()를 dict() 타입으로 변환

최근 창호 관련 홍보, 부동산 매물 확보와 부동산 분양 등의 홍보 등을 위한 DM 주소 확보를 위해 공공데이터 포털에서 아파트 관련 정보를 추출하고 있는데, 아파트 단지 코드가 필요하여 관련 open api를 활용하여 추출해야 했다.

 

그런데, 샘플 데이터인 xml 데이터를 파싱 해서 보니 OrderedDict 타입으로 되어있었다.

이 자료를 엑셀로 저장하기 위해 dict 타입으로 변환해보았다.

from collections import OrderedDict
import json

orddict1 = OrderedDict([('s1', '제주특별자치도'), ('s2', '서귀포시')])
orddict2 = OrderedDict([('s1', '제주특별자치도'), ('s2', '서귀포시'), ('s3', OrderedDict([('bjdCode', '5013011200'), ('kaptCode', 'A10024215'), ('kaptName', 'e편한세상중문아파트')]))])

print(type(orddict1), type(orddict2)) 
# <class 'collections.OrderedDict'> <class 'collections.OrderedDict'>

- OrderedDict는 collections 모듈의 클래스다.

 

dict() 활용

dict1 = dict(orddict1)
print(dict1, type(dict1))
# {'s1': '제주특별자치도', 's2': '서귀포시'} <class 'dict'>

dict2 = dict(orddict2)
print(dict2, type(dict2))
# {'s1': '제주특별자치도', 's2': '서귀포시', 's3': OrderedDict([('bjdCode', '5013011200'), ('kaptCode', 'A10024215'), ('kaptName', 'e편한세상중문아파트')])} <class 'dict'>

- OrderedDict 타입을 dict()에 인자로 넣으면 dict 타입으로 변환된다.

- 그런데, 문제는  중첩(nested)된 OrderedDict 부분은 변환되지 않는다.

 

for nd in dict2:
    if type(dict2[nd]) is OrderedDict:
        ordd = dict(dict2[nd])
        # print(ordd)
        for d in ordd:
            print(ordd[d])
    else:
        print(dict2[nd])
 
 --------------------------------------
 
 [결과] 

제주특별자치도
서귀포시
5013011200
A10024215
e편한세상중문아파트

- for 문에서 타입을 조건 분기로 체크(type(dict2[nd]) is OrderedDict)하여 해결은 했으나, 더 좋은 방법이 있었다.

 


good4me.co.kr


json 라이브러리로 변환하기

# import json 추가

jdict1 = json.loads(json.dumps(dict1))
print(jdict1, type(jdict1))
# {'s1': '제주특별자치도', 's2': '서귀포시'} <class 'dict'>
jdict2 = json.loads(json.dumps(dict2))
print(jdict2, type(jdict2))
# {'s1': '제주특별자치도', 's2': '서귀포시', 's3': {'bjdCode': '5013011200', 'kaptCode': 'A10024215', 'kaptName': 'e편한세상중문아파트'}} <class 'dict'>

- json.dumps()로 object를 JSON 형태의 str로 변환시켜주고, json.loads()는 str, bytes 타입을 python object로 변환시켜준다.

print(json.dumps(dict1))
# {"s1": "\uc81c\uc8fc\ud2b9\ubcc4\uc790\uce58\ub3c4", "s2": "\uc11c\uadc0\ud3ec\uc2dc"}

print(json.dumps(dict2))
# {"s1": "\uc81c\uc8fc\ud2b9\ubcc4\uc790\uce58\ub3c4", "s2": "\uc11c\uadc0\ud3ec\uc2dc", "s3": {"bjdCode": "5013011200", "kaptCode": "A10024215", "kaptName": "e\ud3b8\ud55c\uc138\uc0c1\uc911\ubb38\uc544\ud30c\ud2b8"}}

즉, OrderedDict() 객체인 dict1, dict2를 JSON 형태로 변환한 후, 다시 dict로 변환하여 for 문으로 추출하는 방법도 있다.

 

 

댓글