본문 바로가기

About/Python

[Python] Collections - OrderedDict

OrderedDict

  • 기본 딕셔너리와 거의 비슷하지만, 입력된 아이템들의 순서를 기억하는 Dictionary 클래스 
  • 즉 Dict와 달리, 데이터를 입력한 순서대로 dict를 반환함
  • collections로 부터 import 하여 사용
from collections import OrderedDict

 

기존 Dict 예시 
d = {}
d['Hello'] = 100
d['How'] = 200
d['are'] = 300
d['you'] = 500
print(d)

v = {}
v['How'] = 200
v['are'] = 300
v['you'] = 500
v['Hello'] = 100
print(v)


if(d == v):
    print("두 Dictionary가 동일하다")

기본 Dict() 예제 실행결과

두 Dictionary의 입력 순서를 다르게 해주어서 결과출력이 d, v가 다름에도 비교식은 같다고 판단한다,

즉 순서와 상관없이, key/value 값이 동일하므로 동일한 자료로 인식하는 것이 일반적인 Dictionary이다.

OrderedDict 예시
from collections import OrderedDict

d = OrderedDict()
d['Hello'] = 100
d['How'] = 200
d['are'] = 300
d['you'] = 500
print(d)

v = OrderedDict()
v['How'] = 200
v['are'] = 300
v['you'] = 500
v['Hello'] = 100
print(v)


if(d == v):
    print("두 Dictionary가 동일하다")
else:
    print("두 Dictionary는 다르다.")

OrderedDict 예제 실행결과

위의 Dict예제에서 Dict 대신 OrderedDict로 바꿔보았다.

출력형태는 비슷하지만 비교 결과가 다르게 나온다. 왜냐하면 OrderedDict의 경우에는 순서까지도 저장되기 때문에 순서 또한 비교 대상으로 포함이 되기 때문이다.

 

 

  • OrderedDict를 이용하면 기존 ㄴDict type의 값을, value 또는 key 값으로 정렬할 때 사용할 수 있다.
from collections import OrderedDict

d = {}
d['b'] = 600
d['d'] = 200
d['c'] = 300
d['a'] = 500
print(d)

#key값으로 정렬
od = OrderedDict(sorted(d.items(), key = lambda t : t[0]))
print("key 값으로 정렬 후 : ")
print(od)

#value값으로 정렬
od = OrderedDict(sorted(d.items(), key = lambda t : t[1]))
print("value 값으로 정렬 후 : ")
print(od)


OrderedDict 정렬 예제 실행결과

위의 예제는 기존의 Dict를 이용하여 정렬된 형태의 OrderedDict를 생성하는 예제이다.

 

위의 코드에서

sorted(d.items(), key = lambda t : t[0]) 는 dictionary의 key값으로 정렬하겠다,

sorted(d.items(), key = lambda t : t[1]) 는 dictionary의 value값으로 정렬하겠다라는 의미이다.

 

 

OrderedDict의 함수를 살펴보자.

 

Update()({newkey : new value}) 

update()는 OrderedDict에 새로운 멤버를 추가하는 함수이다.

 

from collections import OrderedDict

d = OrderedDict()
d['b'] = 600
d['d'] = 200
d['c'] = 300
d['a'] = 500

# {'e' : 700} 멤버 추가
d.update({'e' : 700})

print(d)

OrderedDict의 update() 예제

기존의 dict에  { 'e' : 700 } 인 멤버가 추가된 것을 확인할 수 있다.

 

popitem(last = True)

popitem은 OrderedDict의 아이템을 반환 및 삭제하는 함수이다.

인자인 last에 따라 결과가 다르다. (기본값은 last = true이다.)

last가 True인 경우 가장 마지막에 삽입된 데이터를 반환하고 삭제한다.(Last In First Out, LIFO)

last가 False인 경우 가장 처음 삽입된 데이터를 반환하고 삭제한다.(First In First Out, FIFO)

from collections import OrderedDict

d = OrderedDict()
d['b'] = 600
d['d'] = 200
d['c'] = 300
d['a'] = 500

print("기존의 OrderedDict : ")
print(d)

print("popitem(last = True) 실행 후 : ")
d.popitem(last=True)
print(d)

print("popitem(last = False) 실행 후 : ")
d.popitem(last=False)
print(d)

OrderedDict의 popitem() 예제

예제 실행결과를 살펴보면 popitem(last = True)를 실행하였을 때 가장 마지막에 삽입된 { 'a' : 500 } 아이템이 삭제 되었으며, popitem(last = False)인 경우 가장 먼저 삽입된 { 'b' : 600 } 아이템이 삭제된 것을 볼 수 있다.

 

move_to_end(key, last = True)

move_to_end()는 key값에 해당되는 아이템을 OrderedDict의 맨 뒤 혹은 맨 앞으로 이동시키는 함수이다.

last가 True인 경우 해당 아이템이 맨 뒤로 이동한다.

last가 False인 경우 해당 아이템이 맨 앞으로 이동한다.

 

from collections import OrderedDict

d = OrderedDict()
d['b'] = 600
d['d'] = 200
d['c'] = 300
d['a'] = 500

print("기존의 OrderedDict : ")
print(d)

d.move_to_end('d',True)
print("d.move_to_end('d',True) 실행 후 : ")
print(d)

d.move_to_end('a',False)
print("d.move_to_end('a',False)")
print(d)

OrderedDict의 move_to_end() 예제

d.move_to_end('d',True) 를 실행하였을 때 { 'd' : 200 } 이 맨 뒤로 이동한 것을 확인할 수 있다.

d.move_to_end('a',False) 를 실행하였을 때 { 'a' : 500 } 이 맨 앞으로 이동한 것을 확인할 수 있다.

 

 


Python Collections의 OrderedDict에 대하여 살펴보았다.

'About > Python' 카테고리의 다른 글

[Python] Counter (단어 개수 세기)  (2) 2020.12.30
[Python] Collections - defaultdict (단어 개수 세기)  (0) 2020.12.27
[Python] Collections - deque  (0) 2020.12.20
[Python] Lambda & Map & Reduce  (0) 2020.12.20
[Python] Enumerate(), Zip()  (0) 2020.12.13