EXCELSIOR

collections 모듈 - OrderedDict 본문

Python/자료구조

collections 모듈 - OrderedDict

Excelsior-JH 2017. 9. 7. 13:54

collections.OrderedDict

1. OrederedDict 란?

OrderedDict 는 기본 딕셔너리(dictionary)와 거의 비슷하지만, 입력된 아이템들(items)의 순서를 기억하는 Dictionary 클래스이다. collections.OrderedDict의 자세한 내용은 docs.python.org에서 확인 할 수 있다.
OrderedDict 는 아이템들(items)의 입력(또는 삽입) 순서를 기억하기 때문에 sorted()함수를 사용하여 정렬된 딕셔너리(sorted dictionary)를 만들때 사용할 수 있다. 아래 [예제1]은 sorted dictionary 를 만드는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 예제1 - sorted()를 이용한 정렬된 OrderedDict 만들기
 
from collections import OrderedDict
 
# 기본 딕셔너리 
= {'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)])
'''
cs

위의 [예제1]에서 확인 할 수 있듯이 키(key)를 기준으로 알파벳 순으로 정렬된(sorted) OrderedDict에 새로운 아이템은 {'grape': 5}를 추가하게 되면 더이상 정렬은 유지되지 않게 된다.

2. collections.OrderedDict의 메소드들

OrderedDict의 메소드들은 기본 딕셔너리(Dict)와 거의 비슷하다. OrderedDict 메소드들 중 popitemmove_to_end 에 대해 알아보도록 하자.

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)방식으로 값을 반환 & 삭제 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 예제-2 OrderedDict.popitem()
 
import operator
from collections import OrderedDict
 
# 기본 딕셔너리 
= {'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)
'''
cs

2) move_to_end(key, last=True)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 예제-3 OrderedDict.move_to_end()
 
import operator
from collections import OrderedDict
 
# 기본 딕셔너리 
= {'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)])
'''
cs


'Python > 자료구조' 카테고리의 다른 글

내장함수 zip() 과 itertools.zip_longest() 함수  (0) 2017.09.21
collections 모듈 - namedtuple  (5) 2017.08.22
collections 모듈 - deque  (3) 2017.08.20
collections 모듈 - defaultdict  (0) 2017.08.18
collections 모듈 - Counter  (7) 2017.08.17
Comments