核心对象类型复习和总结——比较、相等和为真——python 2.x 和 3.x 的字典比较 | 第二部分 类型与操作 —— 第 9 章: 元组,文件和其他 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-380玩彩网官网入口
前面章节的倒数第二点也值得说明。在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中的原来的行为。