IT

[파이썬 기초] 순서지정된 딕셔너리 OrderedDict()

생각파워 2018. 11. 22. 15:37

파이썬 딕셔너리는 순서를 관리하지 않는다.

내가 a, b, c  순으로 키를 입력했다고해서, 출력 시 a, b, c로 출력되지 않는다는 말이다.

진짜 그런지 딕셔너리를 생성해 보았다.

 

 >>> random_dict = dict()
>>> random_dict['a'] = 1
>>> random_dict['b'] = 2
>>> random_dict['c'] = 3
>>> random_dict
{'a': 1, 'b': 2, 'c': 3}

 

순서대로 출력된다.

조금만 더 넣어보자.

 >>> random_dict['pros'] = 4
>>> random_dict['cons'] = 5
>>> random_dict
{'a': 1, 'b': 2, 'c': 3, 'pros': 4, 'cons': 5}

 

계속 순서대로 출력된다.

조금만 더...

>>> random_dict['aa'] = 6
>>> random_dict
{'a': 1, 'b': 2, 'c': 3, 'pros': 4, 'cons': 5, 'aa': 6} 

 

...

어쨌든 맞을거다. 책에 그렇게 나와있다.

몇번 그런걸 본적이 있는것 같기도 하고...

 

어쨌든, 만약 순서를 지정해서 사용해야하는 상황이 발생했을때, OrderedDict 객체가 그 해법이 될 수 있다.

 

>>> from collections import OrderedDict
>>> ordered_dict = OrderedDict()
>>> ordered_dict['a'] = 1
>>> ordered_dict['b'] = 2
>>> ordered_dict['c'] = 3
>>> ordered_dict
OrderedDict([('a', 1), ('b', 2), ('c', 3)]) 

 

입력한 a, b, c  순서대로 내용이 입력된 것을 알 수 있다.

기존에 있는 키에 대한 값만 업데이트하는 경우는 순서를 유지한다.

 

>>> ordered_dict
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> ordered_dict['a']=4
>>> ordered_dict
OrderedDict([('a', 4), ('b', 2), ('c', 3)]) 

 

키가 지워지면 순서를 유지하지 않는다.

 

>>> del ordered_dict['a']
>>> ordered_dict
OrderedDict([('b', 2), ('c', 3)])
>>> ordered_dict['a']=5
>>> ordered_dict
OrderedDict([('b', 2), ('c', 3), ('a', 5)]) 

 

'a'키를 지우고 새로 입력하자 제일 마지막으로 이동한 것을 알 수 있다.

 

OrderedDict에 사용할 수 있는 메서드는 두가지가 있다.

 

1. OrderedDict의 처음이나 마지막 값 리턴하고 삭제 : popitem()

 

>>> ordered_dict
OrderedDict([('b', 2), ('c', 3), ('a', 5)])
>>> k, v = ordered_dict.popitem()            # 인자가 없거나 last=true라고 주면 마지막 값('a',5)을 리턴하고 삭제
>>> k
'a'
>>> v
5
>>> ordered_dict
OrderedDict([('b', 2), ('c', 3)]) 
>>> k, v = ordered_dict.popitem(last=False)  # 인자를 last=False로 주면 처음값('b',2)을 리턴하고 삭제
'b'
>>> v
2
>>> ordered_dict
OrderedDict([('c', 3)])

 

 

2. 키와 값을 처음이나 마지막으로 이동 : move_to_end()

>>> od = OrderedDict.fromkeys('red')                         # 'red'의 각 문자를 이용해 딕셔너리 생성
>>> od
OrderedDict([('r', None), ('e', None), ('d', None)])         # 값이 None인 딕셔너리 생성됨.
>>> od.move_to_end('r')                                      # 'r'키값을 제일 마지막으로 이동
>>> od
OrderedDict([('e', None), ('d', None), ('r', None)])
>>> od.move_to_end('r', last=False)                          # 'r'키값을 제일 처음으로 이동(last=False)
>>> od
OrderedDict([('r', None), ('e', None), ('d', None)]) 

 

 

반응형