Ordered Dict를 생성자를 사용하여 초기 데이터의 순서를 유지하도록 초기화하는 올바른 방법은 무엇입니까?
순서 사전(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
초기화 시에 통과된 투플의 목록, 또는 투플의 목록 또는 목록의 목록 등의 순서를 보존합니까(위의 두 번째 예와 세 번째 예)?입니까 여부를 하려면 어떻게 ?
OrderedDict
실제로 질서를 유지하고 있습니까?dict
예측할 수 없는 순서를 가지고 있는데, 운 좋게도 내 테스트 벡터가 예측할 수 없는 명령어의 순서와 같은 초기 순서를 가지고 있다면 어떻게 될까요?를 들어,어 에,d = OrderedDict({'b':2, 'a':1})
는 글을 .d = OrderedDict({'a':1, 'b':2})
되어 있다고 잘못 할 수 .이 경우에, 저는 그 사실을 알게 되었습니다.dict
가나다순으로 정렬되어 있지만 항상 그렇지는 않을 수도 있습니다.테스트 벡터가 끊어질 때까지 반복적으로 시도하는 것 외에 데이터 구조가 순서를 보존하는지 여부를 확인하기 위해 반례를 사용하는 신뢰할 수 있는 방법은 무엇입니까?
추신: "OrderedDict 구성자와 update() 메서드는 모두 키워드 인수를 허용하지만 파이썬의 함수 호출 시맨틱스가 일반 순서 없는 사전을 사용하여 키워드 인수를 전달하므로 순서가 손실됩니다."
추신: 앞으로 OrderedDict가 kwargs의 질서도 지켜주기를 바랍니다 (example 1): http://bugs.python.org/issue16991
Ordered Dict는 접근할 수 있는 모든 명령을 보존합니다.초기화를 위해 순서가 지정된 데이터를 전달하는 유일한 방법은 지난 두 예에서와 같이 키-값 쌍의 목록(또는 일반적으로 반복 가능)을 전달하는 것입니다.링크한 문서에 나와 있듯이 OrderedDict는 키워드 인수 또는 dict 인수를 전달할 때 OrderedDict 작성자가 보기 전에 제거되므로 어떠한 주문에도 액세스할 수 없습니다.
마지막 예제에서 목록 이해력을 사용해도 아무것도 변경되지 않습니다.다는 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)])
네, 잘 될 겁니다.정의에 따라 목록은 항상 표시된 방식으로 정렬됩니다.이는 목록 이해에도 적용되며, 생성된 목록은 데이터가 제공된 것과 같은 방식으로 생성됩니다(즉, 목록의 출처는 결정론적일 것이며, 출처는 a입니다).set
아니면dict
많이는 아닙니다.
다음을 확인하는 방법은 무엇입니까?
OrderedDict
실제로 질서를 유지하고 있습니다.딕트에는 예측할 수 없는 순서가 있으므로 운 좋게도 테스트 벡터가 예측할 수 없는 딕트의 순서와 같은 초기 순서를 가지면 어떻게 됩니까?예를 들어, 만약 대신에d = OrderedDict({'b':2, 'a':1})
씁니다d = OrderedDict({'a':1, 'b':2})
, 저는 주문이 보존되어 있다고 잘못 판단할 수 있습니다.이 경우에, 저는 그 사실을 알게 되었습니다.dict
는 알파벳순으로 정렬되지만 항상 성립하지는 않을 수도 있습니다. 즉, 데이터 구조가 순서를 유지하는지, 테스트 벡터가 끊어질 때까지 반복적으로 시도하지 않는지 확인하기 위해 카운터 예제를 사용하는 신뢰할 수 있는 방법은 무엇일까요?
참조를 위해 2개의 튜플의 소스 목록을 보관하고 단위 테스트를 수행할 때 테스트 케이스의 테스트 데이터로 사용합니다.반복해서 주문이 유지되는지 확인합니다.
또한 제너레이터 식을 사용하는 것이 가능합니다(그리고 조금 더 효율적입니다).
d = OrderedDict((i, i) for i in l)
분명히, 이 사소한 경우에 이익은 무시할 수 있습니다.l
, 그러나 만일l
이는 반복기에 해당하거나 생성기에서 결과를 산출하고 있었습니다. 예를 들어 큰 파일을 구문 분석하고 반복하는 데 사용된 경우에는 그 차이가 매우 상당할 수 있습니다(예를 들어 전체 콘텐츠를 메모리에 로드하는 것을 피함).예를 들어,
def mygen(filepath):
with open(filepath, 'r') as f:
for line in f:
yield [int(field) for field line.split()]
d = OrderedDict((i, sum(numbers)) for i, numbers in enumerate(mygen(filepath)))
언급URL : https://stackoverflow.com/questions/25480089/right-way-to-initialize-an-ordereddict-using-its-constructor-such-that-it-retain
'source' 카테고리의 다른 글
파워셸 ISE에서 런스페이스를 재설정할 수 있습니까? (0) | 2023.10.08 |
---|---|
파워셸을 사용하여 계정에 "서비스로 로그온"을 부여하려면 어떻게 해야 합니까? (0) | 2023.10.08 |
푸시 대 이동 비용(스택 대 메모리 근처), 함수 호출 오버헤드 (0) | 2023.10.08 |
디브의 내용물을 포장하지 않는 방법? (0) | 2023.10.08 |
입자 시스템용 점 스프라이트 (0) | 2023.10.08 |