核心对象类型复习和总结——比较、相等和为真——Python 2.X 和 3.X 的字典比较
前面章节的倒数第二点也值得说明。在 2.X 中,字典支持大小比较,好像你在比较排序的 "键 / 值" 列表一样:
C:\code> c:\python27\python
>>> D1 = {'a':1, 'b':2}
>>> D2 = {'a':1, 'b':3}
>>> D1 == D2 # Dictionary equality: 2.X + 3.X
False
>>> D1 < D2 # Dictionary magnitude: 2.X only
True
然而,第 8 章中简要地说明了:字典大小比较在 3.X 中被移除了,因为当需要相等测试时,它们招致了太多开销(相等测试在 3.X 中使用了一个优化过的方案,它不会按字面量去比较排序的 "键 / 值" 列表):
C:\code> c:\python33\python
>>> D1 = {'a':1, 'b':2}
>>> D2 = {'a':1, 'b':3}
>>> D1 == D2
False
>>> D1 < D2
TypeError: unorderable types: dict() < dict()
3.X 中的可选方案是要么编写循环来按键比较值,要么手动比较 “键 / 值” 列表 ——items
字典方法和 sorted
内置函数就足够了:
>>> list(D1.items())
[('b', 2), ('a', 1)]
>>> sorted(D1.items())
[('a', 1), ('b', 2)]
>>>
>>> sorted(D1.items()) < sorted(D2.items()) # Magnitude test in 3.X
True
>>> sorted(D1.items()) > sorted(D2.items())
False
这需要更多代码,但在实践中,大多数需要(比较字典)这个行为的程序将发展出更有效率的方法,而非上面这个变通方法或 2.X 中的原来的行为。
推荐文章: