您的位置:首页 > 编程语言 > Python开发

Python中关于集合(set)的思考 

2016-08-20 00:00 246 查看
摘要:在学习python过程中接触到了set数据类型,结合set的特性去对比两个文件的差异。在linux下有diff工具去对比文件的异同,但是输出格式以及相关的对比项可能不是自己最需要的,本篇文章利用python的set数据类型特性进行对比两个文件的差异。

又是好久没有发技术上的文章了,一方面是最近工作也比较忙,同时自己也在学习python,另外一方面是因为个人不喜欢发表一些在互联网上可以直接找到的技术文章,最起码也得加上自己的一些思考和研究才算罢了吧!

虽然python或者说集合这个东西很基础甚至很简单,但我还是想在这里白话白话自己的一个过程。

集合这个东西最早我是在数学里听到的,集合之间可以做一些运算,比如求交集,并集,归属等等。而集合在数学中算是一种散列的数据结构,通俗点来说就是无序的。既然集合是无序的,并且可以做一些集合运算,那这样其实就有很大的用途了,比如说可以比较两个集合的差异,求差集,交集,并集(其实跟没说一样,这不就是集合本身的特性么)。其实我想说的是,我们可以再抽象下,比如说,把一个文件看做集合,文件的内容看做集合的元素,那这样就可以对文件进行做简单的运算了,就可以很清楚的对比两个文件的差异了。

接下来就讲一下使用python的set集合的属性来对比文件差异,效果如下:

sh-4.1#mydiff
Pleaseinputtwoargvs.Example:mydifffile1file2
sh-4.1#mydiffabc1abc2
abc1abc2共同拥有部分:
######################################################
Hello,MynameisAndy_xu!
abc1:特有内容
######################################################
Myweb_siteiswhat?
######################################################
abc2:特有内容
######################################################
Myweb_siteishttp://my.oschina.net/xxbAndy/blog######################################################


执行脚本,加需要对比的两个文件名称作为参数就可以得到文件的相同部分和不同部分了。懂linux的人都知道diff工具也可以对比文件的差异,但其实还是有差异的,另外我只是针对python中的set实践一下想法,请不要耻笑我。。。。

源码部分(代码比较粗糙,不喜勿喷啊):

#!/usr/bin/envpython3
#-*-coding:utf-8-*-
#Author-by:Andy-xu
#Contact:[QQ:371990778]
#Date:2016-07-0616:03
#Update:2016-08-1723:15
#Description:利用set的特性对两个文件进行差异化对比
importsys
argvs=sys.argv

#构造两个文件集合类
classSet_file(object):
def__init__(self,file1,file2):
self.file1=file1
self.file2=file2
defSet_A(self):
A=set()
forfileinopen(self.file1).readlines():
A.add(file.strip())
returnA
defSet_B(self):
B=set()
forfileinopen(self.file2).readlines():
B.add(file.strip())
returnB

#集合运算
defDiff_Set():
try:
Set=Set_file(argvs[1],argvs[2])
Intersections=Set.Set_A()&Set.Set_B()#求交集,提取文件相同内容
printargvs[1]+""+argvs[2]+"共同拥有部分:"
print("######################################################")
forintersectioninIntersections:
printintersection
print("\n\n\n")

Diff_SetA=Set.Set_A()-Set.Set_B()#求差集,提取file1特有内容
print(argvs[1]+":特有内容")
print("######################################################")
iflen(Diff_SetA)==0:
print("Nodifference!")
fordiff_setinDiff_SetA:
print(diff_set)
Diff_SetB=Set.Set_B()-Set.Set_A()#求差集,提取file2特有内容
print("######################################################")
print("\n\n")
print(argvs[2]+":特有内容")
print("######################################################")
iflen(Diff_SetB)==0:
print("Nodifference!")
fordiff_setinDiff_SetB:
print(diff_set)
print("######################################################")
exceptException,e:#捕获异常,并给与友好提示
print("Pleaseinputtwoargvsforthemydiff.Example:"+argvs[0]+"file1file2")

if__name__=='__main__':
Diff_Set()

思考:首先,从集合运算的角度考虑,set本身是支持一些方法来进行集合运算的,比如:

#交集
#printlist(set(a).intersection(set(b)))
#并集
#printlist(set(a).union(set(b)))
#b有a无
#printlist(set(b).difference(set(a)))

其次,源码部分在求差集那块完全可以使用类来封装。综合来说,代码的行数还是可以再减少点滴!

关于pythonset的思考目前就到这里,然而关于python,我还在继续,有想法会继续和大家分享,也希望成长之路有人一起交流。

有想法的Opser!




微信扫一扫
关注该公众号
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: