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

时间:2013-07-08 07:55:47

标签: python types sequences

我的想法有点让我觉得Python中的OrderedDict不是序列类型。它有一个有序的概念,但它不是一个序列。

Python docs

  

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

     

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

__contains__相对应的操作,__add__用于连接,__getitem__包含整数(range(len(foo))),__len____min__,{ {1}},__slice__indexcount等实施比较。

OrderedDicts实现了其中一些方法而不是其他方法,可能是因为按键(如dict)或顺序(如索引)访问项目的语法糖是相同的。

我知道如果有什么实现__lt__我可以循环它。我怎么能肯定知道某件事是否有订单?我原以为这就是" sequence"的意思,第n项始终是第n项。

3 个答案:

答案 0 :(得分:2)

在鸭子打字世界中,这是一个难题。

两个sequences and mapping使用__getitem__()分别使用内部索引和键来访问项目。寻找__getitem__()方法的可用性并不能区分它们,你需要看看方法实际上做了什么。

对于dict,无法知道__getitem__()的整数参数是索引还是键,因此它始终适用于映射样式。

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

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

答案 1 :(得分:0)

issubclass(list, collections.abc.Sequence)

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

答案 2 :(得分: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

现在使用Ordered Dictionaries:

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