programing tip

초기 데이터의 순서를 유지하도록 생성자를 사용하여 OrderedDict를 초기화하는 올바른 방법은 무엇입니까?

itbloger 2020. 8. 8. 11:40
반응형

초기 데이터의 순서를 유지하도록 생성자를 사용하여 OrderedDict를 초기화하는 올바른 방법은 무엇입니까?


초기 데이터의 순서를 유지하도록 순서화 된 사전 (OD)을 초기화하는 올바른 방법은 무엇입니까?

from collections import OrderedDict

# Obviously wrong because regular dict loses order
d = OrderedDict({'b':2, 'a':1}) 

# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b',2), ('a', 1)])

# What about using a list comprehension, will 'd' preserve the order of 'l'
l = ['b', 'a', 'c', 'aa']
d = OrderedDict([(i,i) for i in l])

질문:

  • 는 것이다 OrderedDict튜플 또는 목록 또는 등 목록 목록의 튜플의 튜플의 목록 또는 튜플의 순서를 유지 초기화 (2 & 3 위의 예)의 시간에 통과?

  • OrderedDict실제로 주문을 유지하고 있는지 확인하는 방법은 무엇입니까? a dict에 예측할 수없는 순서가 있으므로 내 테스트 벡터의 초기 순서가 예측할 수없는 사전 순서와 운 좋게 같은 경우 어떻게됩니까? 예를 들어, d = OrderedDict({'b':2, 'a':1})라고 쓰는 대신 d = OrderedDict({'a':1, 'b':2})순서가 보존되었다고 잘못 결론을 내릴 수 있습니다. 이 경우 a dict가 알파벳순으로 정렬되어 있지만 항상 사실이 아닐 수도 있습니다. 반례를 사용하여 데이터 구조가 순서를 유지하는지 여부를 검증하는 신뢰할 수있는 방법은 무엇입니까?

PS 난 그냥 여기이 떠날거야 참조 "파이썬의 함수 호출의 의미는 패스에 있기 때문에 OrderedDict 생성자 및 업데이트 () 메소드를 모두 키워드 인수를 사용할 수 있지만, 순서가 손실됩니다 키워드 인자 정기적으로 정렬되지 않은 사전을 사용"

PPS : 앞으로 OrderedDict는 kwargs의 순서도 보존 할 것입니다 (예제 1) : http://bugs.python.org/issue16991


OrderedDict는 액세스 권한이있는 모든 순서를 유지합니다. 정렬 된 데이터를 초기화하기 위해 전달하는 유일한 방법은 마지막 두 예에서와 같이 키-값 쌍의 목록 (또는 더 일반적으로 반복 가능)을 전달하는 것입니다. 링크 한 문서에서 알 수 있듯이 OrderedDict는 OrderedDict 생성자가보기 전에 순서가 제거되므로 키워드 인수 또는 dict 인수를 전달할 때 순서에 액세스 할 수 없습니다.

마지막 예제에서 목록 이해력을 사용해도 아무것도 변경되지 않습니다. 사이에는 차이가 없습니다 OrderedDict([(i,i) for i in l])OrderedDict([('b', 'b'), ('a', 'a'), ('c', 'c'), ('aa', 'aa')]). 목록 이해력이 평가되고 목록이 생성되고 전달됩니다. OrderedDict는 그것이 어떻게 만들어 졌는지에 대해 아무것도 모릅니다.


# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b', 2), ('a', 1)])

예, 작동합니다. 정의에 따라 목록은 항상 표시되는 방식으로 정렬됩니다. 이것은 목록 이해에도 적용됩니다. 생성 된 목록은 데이터가 제공된 것과 동일한 방식으로 제공됩니다 (즉, 목록의 소스는 결정적 set이거나 소스가 dict거나 많지 않음).

OrderedDict실제로 주문을 유지 하는지 확인하는 방법은 무엇입니까 ? 딕셔너리에 예측할 수없는 순서가 있기 때문에 내 테스트 벡터가 딕셔너리의 예측할 수없는 순서와 운 좋게 동일한 초기 순서를 가지면 어떻게 될까요? 예를 들어, d = OrderedDict({'b':2, 'a':1})라고 쓰는 대신 d = OrderedDict({'a':1, 'b':2})순서가 보존되었다고 잘못 결론을 내릴 수 있습니다. 이 경우 a dict가 알파벳순이라는 것을 알았지 만 항상 사실이 아닐 수도 있습니다. 즉, 카운터 예제를 사용하여 데이터 구조가 순서를 유지하는지 또는 하나가 깨질 때까지 테스트 벡터를 반복적으로 시도하는 것이 부족하지 않은지 확인하는 신뢰할 수있는 방법입니다.

참조를 위해 2- 튜플의 소스 목록을 유지하고 단위 테스트를 수행 할 때 테스트 케이스의 테스트 데이터로 사용합니다. 그것들을 반복하고 순서가 유지되는지 확인하십시오.

참고 URL : https://stackoverflow.com/questions/25480089/right-way-to-initialize-an-orderdict-using-its-constructor-such-that-it-retain

반응형