Appia의 IT세상

파이썬[Python] OrderedDict(순서 있는 Dictionary) - collections 모듈 본문

Python/Python 기본

파이썬[Python] OrderedDict(순서 있는 Dictionary) - collections 모듈

Appia 2020. 4. 20. 07:55
반응형

이번 포스팅은 Collections 모듈에서 OrderedDict(순서 있는 Dictionary) 대해서 살펴보고자 합니다흔히들 많이 이야기 하시는 것이 Dictionary(딕셔너리) 동일하나, 순서를 가지고 있다고 이야기 합니다. 맞는 말입니다. 하지만, 부분에 대해서 정확히 확인하기 위해서는 몇가지를 확인해야 합니다.

 

먼저 기존 Dictionary(딕셔너리) 생성하여 비교 해보도로 하겠습니다. 다음을 한번 살펴보겠습니다.

Example)

= {}
 
d['x'= 100
 
d['y'= 200
 
d['z'= 300
 
= {}
 
v['y'= 200
 
v['x'= 100
 
v['z'= 300
 
print(d)
 
print(v)
 
if d == v :
    print(" Dictionary가 동일")
cs

result) 

{'x'100'y'200'z'300}
 
{'y'200'x'100'z'300}
 
 Dictionary가 동일
cs

 

위의 코드를 살펴보면 분명 결과값에서 d와 v가 다름에도 비교 식에서는 동일하다고 나옵니다. 즉 순서와 상관없이, key/value 쌍이 동일하면 동일하다고 인식하는 것이 일반적인 Dictionary입니다. 그럼 이번에는 Collections 모듈에 포함되어 있는 OrderedDict을 살펴보겠습니다. 

example) 

import collections 
 
ordered_Dict1 = collections.OrderedDict()
 
ordered_Dict1['x'= 100
 
ordered_Dict1['y'= 200
 
ordered_Dict1['z'= 300
 
ordered_Dict2 = collections.OrderedDict()
 
ordered_Dict2['x'= 100
 
ordered_Dict2['z'= 300
 
ordered_Dict2['y'= 200
 
print("Object1")
 
print(ordered_Dict1)
 
print("Object2")
 
print(ordered_Dict2)
 
if ordered_Dict1 == ordered_Dict2 :
 
    print(" Dictionary가 동일")
    
else :
 
    print(" Dictionary가 다름")
cs

result) 

Object1
 
OrderedDict([('x'100), ('y'200), ('z'300)])
 
Object2
 
OrderedDict([('x'100), ('z'300), ('y'200)])
 
 Dictionary가 다름
cs

 

위와는 거의 같은 형태이나 비교 결과가 다르게 나옵니다. 그 이유는 OrderedDict의 경우 순서까지도 저장되어 있기 때문에 관련해서 순서 또한 비교 대상으로 포함이 됩니다. 그럼 이제는 저희 간단한 관련된 메소드들에 대해서 살펴보도록 하겠습니다. 

 

1. update({newkey : newvalue) : 새로운 맴버 추가 

update 명령어는 OrderedDict의 새로운 맴버를 추가하는 명령어입니다. 그럼 다음 예시를 한번 살펴보겠습니다. 

example) 

import collections
 
ordered_Dict1 = collections.OrderedDict()
 
ordered_Dict1['x'= 100
 
ordered_Dict1['y'= 200
 
ordered_Dict1['z'= 300
 
ordered_Dict1.update({"k":400})
 
print(ordered_Dict1)
cs

result)

OrderedDict([('x'100), ('y'200), ('z'300), ('k'400)])
cs

update명령어는 key와 value를 {key:value} 형태로 update 메소드의 인자 값으로 입력해야 합니다. 

 

2. popitem(last) : 객체 반환 후 삭제 

popitem 명령어는 인자 값을 last로 가집니다. 다음을 살펴보겠습니다. 

last = True 일경우, LIFO형태 즉 Last In / First Out 형태로 반환하고 객체를 삭제 합니다. 

last = False 일 경우, FIFO 형태, 즉 First In / First Out 형태로 반환하고 객체를 삭제합니다. 

다음 예시를 살펴보겠습니다. 

example) 

import collections
 
ordered_Dict1 = collections.OrderedDict()
 
ordered_Dict1['x'= 100    #1번째 입력
 
ordered_Dict1['y'= 200    #2번째 입력
 
ordered_Dict1['z'= 300    #3번째 입력
 
print(ordered_Dict1.popitem(last = True))
 
print(ordered_Dict1)
 
print(ordered_Dict1.popitem(last = False))
 
print(ordered_Dict1)
cs

result) 

('z'300)
 
OrderedDict([('x'100), ('y'200)])
 
('x'100)
 
OrderedDict([('y'200)])
cs

위의 코드를 한번 보겠습니다. last가 True임으로 가장 나중에 입력된 부분이 가장 나중에 반환되는 형태임 LIFO입니다. 그래서 ('z', 300)이 반환되고, 해당 아이텝이 삭제 됩니다. 그 결과는 [('x', 100),('y', 200)]입니다. 여기에서 last가 False로 다시한번 popitem을 사용해주시면 가장 먼저 입력된 부분이 리턴되고 삭제됩니다. 즉, ('x',100)부분이 리턴되고 OrderedDict에서는 삭제됩니다. 

 

3. move_to_end(key, last) : 객체 순서 이동 

move_to_end는 OrderedDict에서 순서를 바꿔주는 역할을 합니다. move_to_end의 인자값은 key값과 last를 가집니다. 

last = True 해당 키에 해당하는 객체를 맨 뒤(오른쪽)로 이동 

last = False 해당 키에 해당하는 객체를 맨 앞(왼쪽)으로 이동 

 

그럼 예시를 한번 살펴보도록 하겠습니다. 

example) 

import collections
 
ordered_Dict1 = collections.OrderedDict()
 
ordered_Dict1['x'= 100
 
ordered_Dict1['y'= 200
 
ordered_Dict1['z'= 300
 
print(ordered_Dict1)
 
ordered_Dict1.move_to_end('x',last=True)
 
print(ordered_Dict1)
 
ordered_Dict1.move_to_end('x',last=False)
 
print(ordered_Dict1)
cs

result) 

OrderedDict([('x'100), ('y'200), ('z'300)])
 
OrderedDict([('y'200), ('z'300), ('x'100)])
 
OrderedDict([('x'100), ('y'200), ('z'300)])
cs

 

최초에 ('x', 100)을 move_to_end(x,last=True)를 이용하여 가장 오른쪽으로 이동하였습니다(결과 2번째 주). 그런 후에 다시 move_to_end('x', last = False)를 이용해서 ('x', 100)을 가장 맨 앞으로 이동하였습니다. 

 

이번 포스팅은 collections 모듈에서 OrderedDict에 대해서 살펴봤습니다. collections모듈에서 생각보다 관련된 OrderedDict을 많이 활용할 수 있습니다. 혹 궁금하신 점이 있으시면 언제든지 댓글 및 방명록에 글 남겨 주시길 바랍니다. 

반응형
Comments