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

        又是很久没有发技术上的文章了,一方面是最近工做也比较忙,同时本身也在学习python,另一方面是由于我的不喜欢发表一些在互联网上能够直接找到的技术文章,最起码也得加上本身的一些思考和研究才算罢了吧!python

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

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

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

sh-4.1# mydiff 
Please input two argvs. Example:mydiff file1 file2 
sh-4.1# mydiff abc1 abc2 
abc1 abc2共同拥有部分:
######################################################
Hello,My name is Andy_xu!
abc1 :特有内容
######################################################
My web_site is what?
######################################################
abc2 :特有内容
######################################################
My web_site is http://my.oschina.net/xxbAndy/blog
######################################################
 

执行脚本,加须要对比的两个文件名称做为参数就能够获得文件的相同部分和不一样部分了。懂linux的人都知道diff工具也能够对比文件的差别,但其实仍是有差别的,另外我只是针对python中的set实践一下想法,请不要耻笑我。。。。数据结构

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

#!/usr/bin/env python3
#-*- coding: utf-8 -*-
#Author-by:Andy-xu 
#Contact:[QQ:371990778]
#Date:2016-07-06 16:03
#Update: 2016-08-17 23:15
#Description:利用set的特性对两个文件进行差别化对比
import sys
argvs = sys.argv

#构造两个文件集合类
class Set_file(object):
    def __init__(self,file1,file2):
        self.file1 = file1
        self.file2 = file2
    def Set_A(self):
        A = set()
        for file in open(self.file1).readlines():
            A.add(file.strip())
        return A
    def Set_B(self):
        B = set()
        for file in open(self.file2).readlines():
            B.add(file.strip())
        return B

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

        Diff_SetA =  Set.Set_A() - Set.Set_B()                     #求差集,提取file1特有内容 
        print(argvs[1]+" :特有内容")                            
        print("######################################################")
        if len(Diff_SetA) == 0:
            print("No difference!")
        for diff_set in Diff_SetA:
            print(diff_set)
        Diff_SetB =  Set.Set_B() - Set.Set_A()                     #求差集,提取file2特有内容
        print("######################################################")
        print("\n\n")
        print(argvs[2]+" :特有内容")
        print("######################################################")
        if len(Diff_SetB) == 0:
            print("No difference!")
        for diff_set in Diff_SetB:
            print(diff_set)
        print("######################################################")
    except Exception,e:                                            #捕获异常,并给与友好提示
        print("Please input two argvs for the mydiff. Example:"+argvs[0]+" file1 file2 ")

if __name__ == '__main__':
        Diff_Set()

思考:首先,从集合运算的角度考虑,set自己是支持一些方法来进行集合运算的,好比:学习

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

其次,源码部分在求差集那块彻底可使用类来封装。综合来讲,代码的行数仍是能够再减小点滴!.net

        关于python set的思考目前就到这里,然而关于python,我还在继续,有想法会继续和你们分享,也但愿成长之路有人一块儿交流。code

有想法的Opser!blog

微信扫一扫 关注该公众号

相关文章
相关标签/搜索