又是很久沒有發技術上的文章了,一方面是最近工做也比較忙,同時本身也在學習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
微信掃一掃 關注該公衆號