2

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

Python文档

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

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

对应于__contains__,__add__用于连接的那些操作,__getitem__与整数 (in range(len(foo))), __len__, __min__, __slice__,indexcount. __lt__等实施比较。

OrderedDicts 实现了其中一些方法,但没有实现其他方法,可能是因为通过键(如在 dict 中)或 order(如在 index 中)访问项目的语法糖是相同的。

我知道如果有什么实现__iter__我可以循环通过它。我怎么能确定某样东西是否有订单?我会认为这就是“序列”的含义,第 n 项始终是第 n 项。

4

3 回答 3

2

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

序列和映射都用于__getitem__()访问项目,分别使用内部索引和键。寻找__getitem__()方法的可用性并不能将它们区分开来,您需要查看该方法的实际作用。

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

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

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

于 2013-07-08T09:18:15.433 回答
0

issubclass(list, collections.abc.Sequence)

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

于 2013-07-08T08:18:04.967 回答
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 保留了添加项目的顺序,以便可以以相同的顺序对其进行迭代,但不能在其上使用索引。

于 2013-11-28T19:56:58.310 回答