sets是 Python 2.3 中新增的,它可以用来处理集合类型的数据。什么是集合?无序、唯一。
在这个模块中提供了两个集合类:Set(可变集合)和ImmurableSet(不可变集合)。
在我以前写过的一篇Blog中(一个Python小程序:目录比较程序(一) )有一段代码需要求两个目录中相同文件名的列表,我当时是将两个列表进行排序,然后通过一遍扫描进行求解,还是有一点算法的难度的。如果使用集合类就简单和清晰多了。代码如下:
import filecmp, sys, os
from os.path import walk, isfile, join, basename, normpath, splitext
import sets
if __name__ == “__main__”:
dir1=normpath(sys.argv[1])
dir2=normpath(sys.argv[2])
len1=len(dir1)+1
len2=len(dir2)+1
files1=[]
files2=[]
exts=['.pyc', '.bak', '.ddd', '.png', '.gif', '.jpg']
def visit(arg, dirname, names, files=files1, length=len1):
if basename(dirname)!=’CVS’:
files +=[join(dirname, file)[length:].replace(‘\\’, ‘/’)
for file in names if isfile(join(dirname, file))
and splitext(file)[1].lower() not in exts]
walk(dir1, visit, 0)
1 dirs1 = sets.Set(files1)
def visit(arg, dirname, names, files=files2, length=len2):
if basename(dirname)!=’CVS’:
files +=[join(dirname, file)[length:].replace(‘\\’, ‘/’)
for file in names if isfile(join(dirname, file))
and splitext(file)[1].lower() not in exts]
walk(dir2, visit, 0)
2 dirs2 = sets.Set(files2)
3 common=dirs1 & dirs2
4 dirs1.difference_update(common)
5 dirs2.difference_update(common)
6 files1 = list(dirs1)
7 files1.sort()
8 files2 = list(dirs2)
9 files2.sort()
10 commons=list(common)
11 commons.sort()
12 match, mismatch, error=filecmp.cmpfiles(dir1, dir2, commons)
print ‘%s vs %s’ % (dir1, dir2)
print ’state filename’
print ‘—– ——————————’
for f in files1:
print ‘ > %s’ % f
for f in files2:
print ‘ < %s’ % f
for f in match:
print ‘ = %s’ % f
for f in mismatch:
print ‘ != %s’ % f
第1行:生成dirs1集合
第2行:生成dirs2集合
第3行:求dirs1和dirs2的交集,即求两个目录中相同文件名的集合
第4行:求只在dirs1中存在的文件名,带有_update的方法会更新原集合对象,而不带的则会生成新的集合
第5行:同第4行,求只在dirs2中存在的文件名
第6-7行:将集合转化为列表,并排序
第8-9行:同第6-7行
第10-11行:同第6-7行
第12行:比较两个目录中同名的文件
不过集合是无序的,因此当你需要按顺序输出元素时则需要先将其转化为有序的列表或元组,再进行输出。这一点有些麻烦。
生成一个列表可以从list或tuple甚至dictionary直接生成。如果直接使用dictionary,则会取出键值作为集合的元素,如:
>>> a={1:’a', 2:’b'}
>>> b=sets.Set(a)
>>> b
Set([1, 2])
如果想将字典的值生成集合怎么办呢?
>>> b=sets.Set(a.values())
>>> b
Set(['a', 'b'])
更详细的关于集合类的使用请查阅 Python 2.3 的文档。


