Я хотел бы проверить, является ли коллекция, переданная в функцию, упорядоченной, то есть фиксирован ли порядок элементов. (Я не говорю о «отсортированном».)
set
не заказывается.list
s и tuple
s заказаны.Есть ли общий тест, который я могу использовать?
Упорядоченные неотображаемые коллекции обычно реализуют протокол последовательности (который в основном характеризуется предоставлением индексированного доступа с помощью метода __getitem__
) и может быть проверен на соответствие типу collections.abc.Sequence:
from collections.abc import Sequence
isinstance(set(), Sequence)
# False
isinstance(list(), Sequence)
# True
isinstance(tuple(), Sequence)
# True
Если бы кто-то настаивал на том, чтобы были включены упорядоченные сопоставления, то есть чтобы dict
(упорядочено с Python 3.7 ), вы могли бы протестировать collections.abc.Reversible:
isinstance(set(), Reversible)
# False
isinstance(list(), Reversible)
# True
isinstance(tuple(), Reversible)
# True
isinstance(dict(), Reversible)
# True
Да и что удивительного как? dict
— это отображение.
Это не так. В этом скорее суть. Если бы я назвал что-то здесь «удивительным», то это было принято, хотя это не работает для одного из основных типов данных.
Я все еще не понимаю. dict
(как и набор) явно не последовательность, так что работает нормально. Он не является неотображаемым, он не упорядочен, и его метод __getitem__
обеспечивает не индексированный доступ, а доступ по ключу. Таким образом, у него нет ни одного из трех свойств последовательности, упомянутых в ответе.
dict
заказаны. Начиная с Python 3.7, который вышел уже почти 2,5 года назад. Они также являются коллекциями, и именно об этом вопрос (так сказано три раза). Заказные коллекции. Дикты есть. Метод этого ответа не определяет это.
Что вы имеете в виду под «имплантационными совпадениями» и «внутренними свойствами»? Упорядоченность Dict гарантируется спецификацией языка! Для меня вопрос выглядит просто как примеры, а не как все интересующие их типы коллекций. В противном случае они могли бы просто проверить, есть ли у них список или кортеж (или у них нет набора) и не пришлось спрашивать. Нет, я не знаю лучшего ответа, я хотел бы увидеть его, если есть лучший способ, и я беспокоюсь, что этот ответ, существующий и принятый, делает его похожим на «дело закрыто» и может отпугнуть лучших.
Ну вот ;-) Reversible
, вероятно, лучшее, что вы можете получить. Однако никаких гарантий для пользовательских типов.
Хм, ладно, по крайней мере, все эти стандартные типы (а также str
, collections.deque
и range
) верны. Хотя в 3.7 он сообщает False
вместо dict
, так как это было заказано, но еще не обратимо. Но в целом я согласен с тем, что упорядоченные коллекции, скорее всего, обратимы, а неупорядоченные, скорее всего, нет. (Был немного разочарован, узнав, что itertools.count()
не считается Collection
.)
Ленивые итераторы, такие как count
, концептуально сильно отличаются от коллекций. В конце концов, чтобы собрать все (не считая бесконечности count
) предметы, вам придется его исчерпать, и при этом останется какой-то другой объект для сбора. Из-за лени и бесконечности также было бы очень сложно определить реверс, даже если вы могли бы утверждать, что он упорядочен.
Давайте продолжим обсуждение в чате.
Говорит
False
вместоdict()
. Даже в Python 3.9.