我的想法有点让我觉得Python中的OrderedDict不是序列类型。它有一个有序的概念,但它不是一个序列。
有七种序列类型:字符串,Unicode字符串,列表, 元组,字节数组,缓冲区和xrange对象。
对于其他容器,请参阅内置的dict和set类,以及 收藏模块。 ...大多数序列类型支持以下内容 操作....序列类型也支持比较。
与__contains__
相对应的操作,__add__
用于连接,__getitem__
包含整数(range(len(foo))
),__len__
,__min__
,{ {1}},__slice__
和index
。 count
等实施比较。
OrderedDicts实现了其中一些方法而不是其他方法,可能是因为按键(如dict)或顺序(如索引)访问项目的语法糖是相同的。
我知道如果有什么实现__lt__
我可以循环它。我怎么能肯定知道某件事是否有订单?我原以为这就是" sequence"的意思,第n项始终是第n项。
答案 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保留了项目的添加顺序,因此它可以按相同的顺序迭代,但是不可能在其上使用索引。