본문 바로가기
Engineering WIKI/Python

collections 모듈 - OrderedDict

by wonos 2022. 5. 12.

1. OrederedDict 란?

OrderedDict 는 기본 딕셔너리(dictionary)와 거의 비슷하지만, 입력된 아이템들(items)의 순서를 기억하는 Dictionary 클래스

# 예제1 - sorted()를 이용한 정렬된 OrderedDict 만들기
 
from collections import OrderedDict
 
# 기본 딕셔너리 
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange':2}
 
# 키(key)를 기준으로 정렬한 OrderedDict
ordered_d1 = OrderedDict(sorted(d.items(), key=lambda t:t[0]))
print(ordered_d1)
'''
결과
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
'''
 
# 값(value)를 기준으로 정렬한 OrderedDict
ordered_d2 = OrderedDict(sorted(d.items(), key=lambda t:t[1]))
print(ordered_d2)
'''
결과
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
'''
 
# 키(key)의 길이(len)를 기준으로 정렬한 OrderedDict
ordered_d3 = OrderedDict(sorted(d.items(), key=lambda t:len(t[0])))
print(ordered_d3)
'''
결과
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
'''
 
# ordered_d1에 새로운 아이템 추가
ordered_d1.update({'grape': 5})
print(ordered_d1)
'''
결과
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1), ('grape', 5)])
'''
  • 위의 [예제1]에서 확인 할 수 있듯이 키(key)를 기준으로 알파벳 순으로 정렬된(sorted) OrderedDict에 새로운 아이템은 {'grape': 5} 를 추가하게 되면 더이상 정렬은 유지되지 않게 된다.

1) popitem(last=True)

OrderedDict.popitem(last=True) 메소드는 (key,value) 로 OrderedDict의 아이템들을 반환(return) 및 삭제하는 메소드이다.

popitem()의 인자인 last=는 True일 경우는 LIFO(Last In Last Out)방식으로 값을 반환 및 삭제하고, False 일 경우에는 FIFO(First In First Out)방식으로 값을 반환 & 삭제 한다.

# 예제-2 OrderedDict.popitem()
 
import operator
from collections import OrderedDict
 
# 기본 딕셔너리 
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange':2}
 
# 키(key)를 기준으로 정렬한 OrderedDict
ordered_d = OrderedDict(sorted(d.items(), key=operator.itemgetter(0), reverse=False))
print(ordered_d)
 
# popitem(last=True) 일경우 : LIFO(Last In Last Out)방식으로 pop, default는 True임
for i in range(len(ordered_d)):
    print(ordered_d.popitem(last=True))
    
print('='*50)
    
# 키(key)를 기준으로 정렬한 OrderedDict
ordered_d = OrderedDict(sorted(d.items(), key=operator.itemgetter(0), reverse=False))
print(ordered_d)
 
# popitem(last=False) 일경우 : FIFO(First In First Out)방식으로 pop
for i in range(len(ordered_d)):
    print(ordered_d.popitem(last=False))
    
'''
결과
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
('pear', 1)
('orange', 2)
('banana', 3)
('apple', 4)
==================================================
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
('apple', 4)
('banana', 3)
('orange', 2)
('pear', 1)
'''

2) move_to_end(key, last=True)

***OrderedDict.move_to_end() 메소드는 key가 존재할 경우, (key,value)를 맨 오른쪽(뒤) 또는 맨 왼쪽(앞)으로 이동해주는 메소드이다. move_to_end(key, last=True)의 인자인 last=는 True 일 경우 맨 오른쪽(뒤)로 이동하고, False 인 경우 맨 왼쪽(앞)으로 이동한다.***

# 예제-3 OrderedDict.move_to_end()
 
import operator
from collections import OrderedDict
 
# 기본 딕셔너리 
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange':2}
 
# 키(key)를 기준으로 정렬한 OrderedDict
ordered_d = OrderedDict(sorted(d.items(), key=operator.itemgetter(0), reverse=False))
print(ordered_d)
 
# move_to_end(key, last=True)인 경우: 해당 (key, value)가 맨 오른쪽(뒤)으로 이동함
ordered_d.move_to_end('banana', last=True)
print("move_to_end('banana', last=True) >>> {}".format(ordered_d))
 
# move_to_end(key, last=False)인 경우: 해당 (key, value)가 맨 왼쪽(앞)으로 이동함
ordered_d.move_to_end('banana', last=False)
print("move_to_end('banana', last=False) >>> {}".format(ordered_d))
 
'''
결과
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
move_to_end('banana', last=True) >>> OrderedDict([('apple', 4), ('orange', 2), ('pear', 1), ('banana', 3)])
move_to_end('banana', last=False) >>> OrderedDict([('banana', 3), ('apple', 4), ('orange', 2), ('pear', 1)])
'''

'Engineering WIKI > Python' 카테고리의 다른 글

문자열 split() 과 split(" ") 차이  (0) 2022.05.19
함수 주석  (0) 2022.05.17
any, all 함수  (0) 2022.05.17
operator의 itemgetter를 사용해서 리스트 정렬  (0) 2022.05.17
collections 모듈 - namedtuple  (0) 2022.05.12
collections 모듈 - deque  (0) 2022.05.12
collections 모듈 - defaultdict  (0) 2022.05.12
collections 모듈 - Counter  (0) 2022.05.12