代码及内容源自《Fluent Python》——Luciano Ramalho 著
set 是一个不重复元素的集合,它的一个基本的应用就是去除重复:
>>> l = ['spam','spam','eggs','spam']
>>> set(l)
{'eggs', 'spam'}
>>> list(set(l))
['eggs', 'spam']
set支持集合的基本操作,如 a | b返回并集,a & b返回交集,a - b返回差集。有效利用set的集合运算,能够帮助缩短代码,提高可读性。
例如,现在有一个较大的email地址集(haystack)和一个较小的地址集(needles),我们需要统计needles中有多少也属于haystack。由于有了set,我们可以用一行简单的代码来实现这个目的:
found = len(set(needles) & set(haystack))
作为比较,如果不用集合运算,而用通常的方法,则代码如下:
found = 0
for n in needles:
for n in haystack:
found += 1
在Python3中,set的标准字符串表达形式为{…},但是空集表示为set():
>>> s = {1}
>>> type(s)
set
>>> s
{1}
>>> s.pop()
1
>>> s
set()
使用如{1,2,3}的方式来创建set,与调用构造函数set([1,2,3])相比,速度更快,可读性更高。因为对后者来说,Python需要先获取set对应的构造函数、再创建一个list,然后把list传递到构造函数当中。而前者只需要调用一个特殊的二进制代码BUILD_SET。
对于frozenset,只能通过调用构造函数来创建:
>>> frozenset(range(10))
frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
set comprehension在Python 2.7中被加入:
>>> from unicodedata import name
>>> {chr(i) for i in range(32,256) if 'SIGN' in name(chr(i),'')}
{'#','$','%','+','<','=','>','¢','£','¤','¥','§','©','¬','®','°','±','µ','¶','×','÷'}
由于使用了hash table,dict和set的速度很快,键值搜索的效率很高。具体的性能和原因可参见原书p85-p93。