1. 程式人生 > 其它 >Python中關於集合(set)的思考

Python中關於集合(set)的思考

        又是好久沒有發技術上的文章了,一方面是最近工作也比較忙,同時自己也在學習python,另外一方面是因為個人不喜歡發表一些在網際網路上可以直接找到的技術文章,最起碼也得加上自己的一些思考和研究才算罷了吧!

        雖然python或者說集合這個東西很基礎甚至很簡單,但我還是想在這裡白話白話自己的一個過程。

        集合這個東西最早我是在數學裡聽到的,集合之間可以做一些運算,比如求交集,並集,歸屬等等。而集合在數學中算是一種雜湊的資料結構,通俗點來說就是無序的。既然集合是無序的,並且可以做一些集合運算,那這樣其實就有很大的用途了,比如說可以比較兩個集合的差異,求差集,交集,並集(其實跟沒說一樣,這不就是集合本身的特性麼)。其實我想說的是,我們可以再抽象下,比如說,把一個檔案看做集合,檔案的內容看做集合的元素,那這樣就可以對檔案進行做簡單的運算了,就可以很清楚的對比兩個檔案的差異了。

    接下來就講一下使用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("nnn")

        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("nn")
        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)))

其次,原始碼部分在求差集那塊完全可以使用類來封裝。綜合來說,程式碼的行數還是可以再減少點滴!

        關於python set的思考目前就到這裡,然而關於python,我還在繼續,有想法會繼續和大家分享,也希望成長之路有人一起交流。