2013-07-08 1 views
2

Это немного напоминает мне, что OrderedDict в Python не является типом последовательности. У этого есть концепция порядка, но это не последовательность.Как узнать, имеет ли тип Python концепцию порядка? Что такое последовательность, на самом деле?

Python docs говорит

Есть семь типов последовательностей: строки, строки Unicode, списки, кортежи, ByteArray, буфера, и объекты xrange.

Для других контейнеров см. Встроенные классы dict и set, а также модуль коллекций . ... Большинство типов последовательностей поддерживают следующие операции .... Типы последовательностей также поддерживают сравнения.

Эти операции, соответствующие __contains__, __add__ для конкатенации, __getitem__ с целыми числами (в range(len(foo))), __len__, __min__, __slice__, index и count. __lt__ и т. Д. Реализуют сравнения.

Упорядоченные инструменты реализуют некоторые из этих методов, но не другие, возможно, потому, что синтаксический сахар для доступа к элементам с помощью ключа (как в dict) или порядка (как в индексе) является тем же самым.

Я знаю, если что-то реализует __iter__ Я могу пройти через него. Как я могу определенно узнать, есть ли у кого-то заказ? Я бы подумал, что это означает «последовательность», n-й элемент всегда является n-ым.

ответ

2

В мире печати уток это сложный вопрос.

Как sequences and mapping использовать __getitem__() для доступа к элементам, используя промежуточные индексы и ключи соответственно. Поиск доступности метода __getitem__() не говорит о них отдельно, вам нужно посмотреть, что на самом деле делает этот метод.

Для диктата невозможно узнать, является ли аргумент integer __getitem__() индексом или ключом, поэтому он всегда работает в стиле сопоставления.

Поэтому я считаю, что дикт не является последовательностью, хотя он поддерживает итерацию. То же самое относится к набору.

Глядя на базовый класс collections.abc.Sequence, может быть лучшим испытанием. Для пользовательских типов просто убедитесь, что они получены из этого базового класса.

0

issubclass(list, collections.abc.Sequence)

Примечание это работает только на встроенных типов.

+0

Я определенно заинтересован в пользовательских типах. – pfctdayelise

+2

Это работает и для пользовательских типов, при условии, что автор задал вопрос о создании указанного типа a (фактического или виртуального) подкласса '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 сохраняет порядок добавляются элементы, так что он может повторяться в том же порядке, но на нем невозможно использовать индекс.

Смежные вопросы