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)]) |
반응형