Python 주문 사전인 OrderedDict를 사용하는 방법.

사업

Python 사전(dict 유형의 객체)은 요소의 순서를 유지하지 않습니다. CPython은 3.6부터 그렇게 했지만 다른 구현에서는 구현에 따라 다르며 무기한입니다. 언어 사양은 3.7부터 순서를 유지했습니다.

OrderedDict는 표준 라이브러리의 컬렉션 모듈에서 순서를 유지하는 사전으로 제공됩니다. 이것을 사용하는 것이 안전합니다.

컬렉션 모듈을 가져옵니다. 표준 라이브러리에 포함되어 있으며 설치할 필요가 없습니다.

import collections

다음을 작성하면 모음을 생략할 수 있습니다. 다음 예에서.

from collections import OrderedDict

다음은 OrderedDict를 사용하는 방법에 대한 설명입니다.

  • OrderedDict 객체 생성
  • OrderedDict는 dict의 하위 클래스입니다.
  • 요소를 시작 또는 끝으로 이동
  • 임의의 위치에 새 요소를 추가합니다.
  • 요소 재정렬(재정렬)
  • 키 또는 값으로 요소 정렬

OrderedDict 객체 생성

생성자 collections.OrderedDict()를 사용하여 OrderedDict 개체를 만들 수 있습니다.

빈 OrderedDict 개체를 만들고 값을 추가합니다.

od = collections.OrderedDict()

od['k1'] = 1
od['k2'] = 2
od['k3'] = 3

print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

생성자에 인수를 지정할 수도 있습니다.

키워드 인수, 키-값 쌍의 시퀀스(예: 튜플(키, 값)) 등을 사용할 수 있습니다. 후자는 키-값 쌍인 한 목록 또는 튜플이 될 수 있습니다.

print(collections.OrderedDict(k1=1, k2=2, k3=3))
print(collections.OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)]))
print(collections.OrderedDict((['k1', 1], ['k2', 2], ['k3', 3])))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

버전 3.5까지는 키워드 인수의 순서가 유지되지 않았지만 버전 3.6부터는 유지됩니다.

버전 3.6에서 변경: PEP 468을 수락하면 OrderedDict 생성자의 순서와 update() 메서드에 전달된 키워드 인수가 유지됩니다.
collections — Container datatypes — Python 3.10.0 Documentation

일반 사전(dict 유형 개체)도 생성자에 전달할 수 있지만 dict 유형이 순서를 유지하지 않는 구현의 경우 생성된 OrderedDict도 순서를 유지하지 않습니다.

print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

OrderedDict는 dict의 하위 클래스입니다.

OrderedDict는 dict의 하위 클래스입니다.

print(issubclass(collections.OrderedDict, dict))
# True

OrderedDict도 dict와 동일한 메소드를 가지며, 요소를 가져오고, 변경하고, 추가하고, 제거하는 메소드는 dict와 동일합니다.

print(od['k1'])
# 1

od['k2'] = 200
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

od.update(k4=4, k5=5)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('k4', 4), ('k5', 5)])

del od['k4'], od['k5']
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

자세한 내용은 다음 문서를 참조하세요.

요소를 시작 또는 끝으로 이동

OrderedDict의 자체 메서드인 move_to_end()를 사용하여 요소를 시작 또는 끝으로 이동할 수 있습니다.

키를 첫 번째 인수로 지정하십시오. 기본값은 끝으로 이동하는 것이지만 마지막 두 번째 인수가 false이면 처음으로 이동합니다.

od.move_to_end('k1')
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1)])

od.move_to_end('k1', False)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

임의의 위치에 새 요소를 추가합니다.

임의의 위치에 새 요소를 추가하여 새 OrderedDict 개체를 만들 수 있습니다. 구체적으로 다음 흐름에서 수행할 수 있습니다.

  1. list()를 사용하여 items() 메서드로 얻을 수 있는 뷰 객체를 나열합니다.
  2. 목록의 insert() 메서드에 키-값 쌍의 튜플(키, 값)을 추가합니다.
  3. 생성자 컬렉션에 전달하여 새 개체를 만듭니다.OrderedDict()
l = list(od.items())
print(l)
# [('k1', 1), ('k2', 200), ('k3', 3)]

l.insert(1, ('kx', -1))
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)])

insert()는 삽입할 위치를 첫 번째 인수로 지정하고 삽입할 요소를 두 번째 인수로 지정합니다.

예제에서 새 개체는 원래 변수에 할당되고 새 요소는 원래 개체 자체에 추가되지 않습니다.

요소 재정렬(재정렬)

요소 교체는 위의 예와 동일한 프로세스입니다.

  1. list()를 사용하여 items() 메서드로 얻을 수 있는 뷰 객체를 나열합니다.
  2. 목록의 요소 바꾸기
  3. 생성자 컬렉션에 전달하여 새 개체를 만듭니다.OrderedDict()
l = list(od.items())
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

l[0], l[2] = l[2], l[0]
print(l)
# [('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)])

키를 지정하여 교체하고 싶다면 index() 메서드를 사용하여 아래와 같이 키 목록에서 인덱스(위치)를 가져옵니다.

l = list(od.items())
k = list(od.keys())
print(k)
# ['k2', 'kx', 'k1', 'k3']

print(k.index('kx'))
# 1

l[k.index('kx')], l[k.index('k3')] = l[k.index('k3')], l[k.index('kx')]
print(l)
# [('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

키 또는 값으로 요소 정렬

items() 메서드로 얻을 수 있는 뷰 객체를 기반으로 정렬된 키-값 쌍의 튜플(키, 값) 목록을 만들고 이를 생성자 collections.OrderedDict()에 전달하여 새 객체를 만듭니다.

정렬은 내장 함수 sorted()의 인수 키로 튜플(키, 값)에서 키 또는 값을 반환하는 익명 함수(람다 식)를 지정하여 수행됩니다.

순서를 반대로 하려면 sorted()의 reverse 인수를 true로 설정하십시오.

print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

od_sorted_key = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[0])
)
print(od_sorted_key)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('kx', -1)])

od_sorted_value = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[1], reverse=True)
)
print(od_sorted_value)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])
Copied title and URL