有时候,有意义比较的 “局部序列” 是有用的,甚至在出现不同类型对象的情况下也是如此(例如,“依次” 处理所有浮点值,即使它们与其他地方处理的字符串没有可比性)。
排序失败
当然,上面执行 “list diff” 的代码几乎可以任意扩展。例如,list1 和 list2 可以是下面这样的小列表的集合。请试着猜一下哪些部分是可以排序的:
清单 4. 可排序和不可排序列表的大杂烩
['x','y','z', 1],
['x','y','z', 1j],
['x','y','z', 1j, 1], # Adding an element makes it unsortable
[0j, 1j, 2j], # An obvious "natural" order
[0j, 1, 2],
[0, 1, 2], # Notice that 0==0j --> True
[chr(120), chr(240)],
[chr(120), chr(240), 'x'],
[chr(120), chr(240), u'x'], # Notice u'x'=='x' --> True
[u'a', 'b', chr(240)],
[chr(240), u'a', 'b'] # Same items, different initial order
我编写了一个小程序来尝试排序各列表:
清单 5. 对各列表进行排序的结果
% python compare.py
(0) ['x', 'y', 'z', 1] --> [1, 'x', 'y', 'z']
(1) ['x', 'y', 'z', 1j] --> [1j, 'x', 'y', 'z']
(2) ['x', 'y', 'z', 1j, 1] --> exceptions.TypeError
(3) [0j, 1j, 2j] --> exceptions.TypeError
(4) [0j, 1, 2] --> exceptions.TypeError
(5) [0, 1, 2] --> [0, 1, 2]
(6) ['x', '\xf0'] --> ['x', '\xf0']
(7) ['x', '\xf0', 'x'] --> ['x', 'x', '\xf0']
(8) ['x', '\xf0', u'x'] --> exceptions.UnicodeDecodeError
(9) [u'a', 'b', '\xf0'] --> [u'a', 'b', '\xf0']
(10) ['\xf0', u'a', 'b'] --> exceptions.UnicodeDecodeError
通过前面的解释,或多或少能够猜出一部分结果。但是,看一下 (9) 和 (10),这两个列表以不同次序包含完全相同的对象:由此可见,排序是否失败不但取决于列表中 对象的类型和值,还取决于 list.sort() 方法的特定实现!
修订比较
自 1.5.2 以来,Python 发展出了一种非常有用的数据类型:集(set),它最初是一个标准模块,后来成了一种内置类型(模块还包含一些额外的特性)。对于上面描述的许多问题,只需使用集来取代列表即可轻松地判断对象是在一个集合中、在另一个集合中还是同时存在于两个集合中,而不需要编写自己的 “list diff” 代码。例如:
清单 6. 集与集操作
>>> set1 = set([1j, u'2', 3, 4.0])
>>> set2 = set([4, 3, 2, 1])
>>> set1 | set2
set([3, 1, 2, 1j, 4.0, u'2'])
>>> set1 & set2
set([3, 4])
相关专题
- Python实用指南 (220篇文章)
- Python相关文章 (220篇文章)
- Python编程 (220篇文章)
- 安装qmail全套功略 (18次浏览)
- TurboLinux 入门教程:第七课 TurboLinux简介 (18次浏览)
- Linux系统管理员秘技:用快捷命令一招制胜 (18次浏览)
- Linux系统命令分类详解 (1) (18次浏览)
- Linux下使用aMsn详解 (18次浏览)
- 你会在Linux下用POP3收Web电子邮箱吗? (18次浏览)
- 在Linux中用三款工具轻松制作网页 (18次浏览)
- Linux上的偷窺裝置 (1394的使用) (18次浏览)
- 深入浅出分析Linux内核漏洞的问题 (18次浏览)
- Linux内核调试工具:Kdb应用指南(4) (18次浏览)



