为什么 OrderedDict
的键视图是无序的?
>>> from collections import OrderedDict
>>> xy = OrderedDict([('x', None), ('y', None)])
>>> yx = OrderedDict([('y', None), ('x', None)])
>>> xy == yx
False
>>> xy.keys() == yx.keys()
True
有人认为OrderedDict的键视图应该像OrderedSet一样运作,但实际上它的运作方式与dict.keys相同(即像普通的set)。
Python2中也存在相同的“问题”:
>>> xy.viewkeys() == yx.viewkeys()
True
它们是不同的类型,(odict_keys
是dict_keys
的子类)
>>> type(xy.keys())
odict_keys
>>> type({}.keys())
dict_keys
已经存在一个适用于有序键比较的可用方法,但显然只用作odict丰富比较的后检查。这是设计决策还是错误?如果这是设计决策,哪里可以找到对其进行讨论的理由?
list(xy) == list(yx)
。 - Benjamin Hodgsonall(x == y for x, y in zip(xy, yx))
。 - mgilsonlen
的值,或者使用itertools.zip_longest
函数,并加上一个哨兵(sentinel),否则会出现以下情况:当一个键集合是另一组键集合的截断时,将返回True
。你也可以将更多的工作推到 C 层,通过在顶部导入from operator import eq
并在测试站点执行len(xy) == len(yx) and all(map(eq, xy, yx))
来验证长度,然后尽可能高效地执行 C 级别的键比较,从而使所有但最小运行速度更快。 - ShadowRangerpypy
)。让KeysView
在有序字典和普通字典中表现不同可能会使它们的实现更加困难(这在语言决策中有时会考虑到)。 - mgilson