OrderedDict란 무엇인가?
OrderedDict는 Python 내장 dict 객체의 서브클래스로, collections 모듈에 포함된 표준 라이브러리 클래스입니다. 일반 dict와의 핵심적인 차이점은 OrderedDict가 키가 삽입된 순서를 그대로 유지한다는 점입니다. 반면 일반 dict에서는 키의 순서가 삽입 순서와 다르게 나타날 수 있습니다.
참고로 Python 3.7부터는 일반 dict도 삽입 순서를 유지하도록 언어 사양에 포함되었지만, OrderedDict는 순서를 활용한 move_to_end() 같은 전용 메서드와 순서를 고려하는 동등성 비교 등 추가 기능을 제공하기 때문에 여전히 유용하게 사용됩니다.
OrderedDict를 사용하려면 먼저 collections 표준 라이브러리 모듈을 임포트해야 합니다.
import collections
이번 글에서는 OrderedDict의 주요 연산과 일반 dict와의 차이점을 예제 코드를 통해 살펴보겠습니다.
1. 일반 Dict와 OrderedDict의 순서 비교
dict와 OrderedDict에 각각 키와 값을 삽입해 보면, 일반 dict는 출력 순서가 달라질 수 있는 반면 OrderedDict는 항상 삽입한 순서 그대로 유지되는 것을 확인할 수 있습니다.
예제 코드
import collections
# 일반 dict 생성
my_dict = {}
my_dict['AA'] = 11
my_dict['BB'] = 22
my_dict['CC'] = 33
my_dict['DD'] = 44
for item in my_dict.items():
print(item)
print()
# OrderedDict 생성
my_ord_dict = collections.OrderedDict()
my_ord_dict['AA'] = 11
my_ord_dict['BB'] = 22
my_ord_dict['CC'] = 33
my_ord_dict['DD'] = 44
for item in my_ord_dict.items():
print(item)
실행 결과
('AA', 11)
('CC', 33)
('BB', 22)
('DD', 44)
('AA', 11)
('BB', 22)
('CC', 33)
('DD', 44)
위 결과에서 볼 수 있듯이, 일반 dict는 'CC'가 'BB'보다 먼저 출력되는 등 순서가 뒤섞일 수 있지만, OrderedDict는 삽입한 순서(AA → BB → CC → DD)를 정확히 유지합니다.
2. 특정 키의 값 변경 시 순서 유지 여부
기존 키의 값을 변경할 때, OrderedDict는 키의 순서를 그대로 유지합니다. 반면 일반 dict의 경우 값 변경 후 순서가 바뀔 수도 있고 그렇지 않을 수도 있습니다.
예제 코드
import collections
# 일반 dict 생성
my_dict = {}
my_dict['AA'] = 11
my_dict['BB'] = 22
my_dict['CC'] = 33
my_dict['DD'] = 44
for item in my_dict.items():
print(item)
# 키 BB의 값 변경
my_dict['BB'] = 100
print('After changing in Dict')
for item in my_dict.items():
print(item)
print()
# OrderedDict 생성
my_ord_dict = collections.OrderedDict()
my_ord_dict['AA'] = 11
my_ord_dict['BB'] = 22
my_ord_dict['CC'] = 33
my_ord_dict['DD'] = 44
for item in my_ord_dict.items():
print(item)
# 키 BB의 값 변경
my_ord_dict['BB'] = 100
print('After changing in Ordered Dict')
for item in my_ord_dict.items():
print(item)
실행 결과
('AA', 11)
('BB', 22)
('CC', 33)
('DD', 44)
After changing in Dict
('AA', 11)
('CC', 33)
('DD', 44)
('BB', 100)
('AA', 11)
('BB', 22)
('CC', 33)
('DD', 44)
After changing in Ordered Dict
('AA', 11)
('BB', 100)
('CC', 33)
('DD', 44)
일반 dict에서는 값 변경 후 'BB'가 마지막 위치로 이동했지만, OrderedDict에서는 'BB'가 원래 자리(두 번째)에 그대로 남아 있는 것을 확인할 수 있습니다.
3. 요소 삭제 후 재삽입 시 동작
OrderedDict에서 특정 요소를 삭제한 뒤 같은 키와 값을 다시 삽입하면, 해당 항목은 맨 뒤로 이동합니다. 즉, 삭제 작업은 기존의 순서 정보를 제거하고, 재삽입 시에는 새로운 항목처럼 취급되어 사전의 끝에 추가됩니다.
예제 코드
import collections
# OrderedDict 생성
my_ord_dict = collections.OrderedDict()
my_ord_dict['AA'] = 11
my_ord_dict['BB'] = 22
my_ord_dict['CC'] = 33
my_ord_dict['DD'] = 44
for item in my_ord_dict.items():
print(item)
# 키 BB 삭제
my_ord_dict.pop('BB')
print('After Deleting')
for item in my_ord_dict.items():
print(item)
# 키 BB 재삽입
my_ord_dict['BB'] = 22
print('After Re-inserting')
for item in my_ord_dict.items():
print(item)
실행 결과
('AA', 11)
('BB', 22)
('CC', 33)
('DD', 44)
After Deleting
('AA', 11)
('CC', 33)
('DD', 44)
After Re-inserting
('AA', 11)
('CC', 33)
('DD', 44)
('BB', 22)
재삽입된 ('BB', 22) 항목이 이전 위치가 아닌 사전의 맨 뒤에 추가된 것을 확인할 수 있습니다. 이러한 동작 방식을 이해하고 있으면, 순서가 중요한 데이터 구조를 설계할 때 의도치 않은 버그를 예방할 수 있습니다.