2013-07-08 1 views
2

Python의 OrderedDict가 시퀀스 유형이 아니라는 사실이 약간 마음이 울립니다. 순서의 개념을 가지고 있지만 순서가 아닙니다. 문자열, 유니 코드 문자열,리스트, 튜플, bytearrays, 버퍼 및 xrange 객체 :파이썬 유형에 순서 개념이 있는지 알아 보는 방법은 무엇입니까? 시퀀스 란 무엇입니까?

Python docs 일곱 개 시퀀스 유형이 있습니다

을 말한다.

다른 컨테이너의 경우 내장 된 dict 및 set 클래스와 콜렉션 모듈을 참조하십시오. ... 대부분의 시퀀스 유형은 다음 연산을 지원합니다. 시퀀스 유형도 비교를 지원합니다. __contains__ 대응

이러한 조작 (range(len(foo))에서) 정수와 연결 용 __add__, __getitem__, __len__, __min__, __slice__, indexcount. __lt__ 등은 비교를 구현합니다.

OrderedDicts는 이러한 메소드 중 일부를 구현하지만 다른 메소드는 구현하지 않습니다. 이는 키 (dict) 또는 색인 (index)과 같은 항목을 액세스하는 구문 설탕이 동일하기 때문일 수 있습니다.

무언가가 __iter__을 구현하면 알고 있습니다. 뭔가 주문이 있는지 어떻게 알 수 있습니까? 나는 그것이 "시퀀스"에 의해 의미되는 것이라고 생각했을 것입니다, n 번째 항목은 항상 n 번째 항목입니다.

답변

2

오리 타이핑 세계에서 이것은 어려운 질문입니다.

모두 sequences and mapping__getitem__()을 사용하면 색인 및 키를 각각 사용하여 항목에 액세스 할 수 있습니다. __getitem__() 메서드를 사용할 수 있는지 여부를 구별하지 못하면 메서드가 실제로 무엇을하는지 알아야합니다.

사전에 대해서는 __getitem__()의 정수 인수가 색인인지 키인지를 알 수 없으므로 항상 매핑 스타일로 작동합니다.

따라서 dict가 반복을 지원하더라도 시퀀스는 전혀 아닐 것으로 생각합니다. 세트에도 똑같이 적용됩니다.

collections.abc.Sequence에서 보는 것은 최상의 테스트 일 수 있습니다. 사용자 정의 유형의 경우,이 기본 클래스에서 파생되었는지 확인하십시오.

0

issubclass(list, collections.abc.Sequence)

참고 내장의 유형에 대한이 유일한 작품.

+0

사용자 정의 유형에도 관심이 있습니다. – pfctdayelise

+2

저자가'collections.abc.Sequence'의 (실제로 또는 가상의) 서브 클래스를 작성하는 것을 괴롭히는 한, 이것은 사용자 정의 타입에도 적용됩니다. – delnan

0

아이디어는 색인 생성입니다.목록과 예 : 문자열 이제

>>> ['a', 'b', 'c'][1]   # get element with index 1 
'b' 
>>> ['a', 'b', 'c'].index('b') # what is the (first) index of 'b'? 
1 

: 순서가 사전에 지금

>>> 'abc'[1] 
'b' 
>>> 'abc'.index('b') 
1 

는 :

>>> from collections import OrderedDict 
>>> od = OrderedDict(zip(['cat', 'dog'], ['meow', 'auuu'])) 
>>> od[1] 
(...) 
KeyError: 1 
>>> od.index('dog') 
AttributeError: 'OrderedDict' object has no attribute 'index' 

그래서 OrderedDict는 항목이 추가 된 순서를 유지는 할 수 있도록 동일한 순서로 반복되지만 인덱스를 사용할 수는 없습니다.