如何知道Python类型是否有顺序的概念?什么是序列,真的?

如何知道Python类型是否有顺序的概念?什么是序列,真的?,python,types,sequences,Python,Types,Sequences,Python中OrderedDict不是序列类型,这让我有点吃惊。它有顺序的概念,但不是序列 说 有七种序列类型:字符串、Unicode字符串、列表、, 元组、ByteArray、缓冲区和xrange对象 对于其他容器,请参见内置的dict和set类,以及 集合模块。。。大多数序列类型支持以下内容 操作…序列类型也支持比较 与\uuuu>相对应的操作包括、\uuuu添加进行连接、\uuuu获取项目和整数(在范围(len(foo)))、\uu len、\uu最小、\uu切片、索引和计数\uuult

Python中OrderedDict不是序列类型,这让我有点吃惊。它有顺序的概念,但不是序列

有七种序列类型:字符串、Unicode字符串、列表、, 元组、ByteArray、缓冲区和xrange对象

对于其他容器,请参见内置的dict和set类,以及 集合模块。。。大多数序列类型支持以下内容 操作…序列类型也支持比较

\uuuu>相对应的操作包括
\uuuu添加
进行连接、
\uuuu获取项目
和整数(在
范围(len(foo))
)、
\uu len
\uu最小
\uu切片
索引和
计数<代码>\uuult\uuuu
等执行比较

OrderedDicts实现了其中一些方法,但没有实现其他方法,这可能是因为通过键(如dict)或顺序(如索引)访问项的语法糖是相同的

我知道如果某个东西实现了
\uuuuu iter\uuuuu
,我可以循环通过它。我怎么能确定某样东西是否有订单?我本以为这就是“顺序”的意思,第n项总是第n项。


注意,这只适用于内置类型。

在duck类型世界中,这是一个困难的问题

两者都使用
\uuu getitem\uuu()
来访问项目,分别使用内部索引和键。寻找
\uuu getitem\uuuuu()
方法的可用性并不能区分它们,您需要查看该方法的实际功能

对于dict,不可能知道
\uuu getitem\uuu()
的整数参数是索引还是键,因此它总是以映射方式工作

因此,我认为dict根本不是序列,即使它支持迭代。这同样适用于集合


查看
collections.abc.Sequence
基类可能是最好的测试。对于自定义类型,只需确保它们是从这个基类派生的。

其思想是索引。 列表示例:

>>> ['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保留了项目添加的顺序,因此可以以相同的顺序进行迭代,但不可能在其上使用索引。

我当然也对自定义类型感兴趣。这也适用于用户定义的类型,前提是作者费心制作所述类型a(实际或虚拟)
collections.abc.Sequence
的子类。