尋找兩個檔案中相同的句子
阿新 • • 發佈:2019-02-02
先介紹問題描述:
已有兩個檔案a.dat和b.dat,每個檔案都包含若干行句子,現在需要你編寫python程式,來找到兩個檔案中相同的句子,完成:
1 將相同的句子列印到common.dat檔案中,每行一句
2 在控制檯打印出程式執行的時長,和相同句子的數量
演算法1:
採用迴圈查詢方法,執行結果為:總共2500個重複的句子,執行總時長:118.077s;
程式碼如下:
import time fileA = ‘/***/f1.dat’ fileB = ‘/***/f2.dat’ fileC = ‘/***/common2.dat’ def findSameSents(file1, file2, file3): f1 = open(file1, 'r') fa = f1.readlines() f1.close() f2 = open(file2, 'r') fb = f2.readlines() f2.close() f3 = open(file3, 'wb') time1 = time.time() count = 0 fc = [i for i in fa if i in fb] f3.writelines(fc) print len(fc) time2 = time.time() time3 = time2 - time1 f3.close() print time3 if __name__ == '__main__': findSameSents(fileA, fileB, fileC)
演算法2:採用集合set,分別將兩個檔案讀入集合,求兩個集合的交集,並將交集寫入檔案common。交集的長度即為所求個數。執行結果:重複句子2500個,執行失常大大縮減至最快190ms。
程式碼如下:
import time fileA = '/***/data/f1.dat' fileB = '/***/data/f2.dat' fileC = '/***/data/common3.dat' def findSameSents(file1, file2, file3): f1 = open(file1, 'r') str1 = [] str2 = [] for line in f1.readlines(): str1.append(line.replace('\n', '')) set1 = set(str1) f1.close() f2 = open(file2, 'r') for line in f2.readlines(): str2.append(line.replace('\n', '')) set2 = set(str2) f2.close() set3 = set1 & set2 print len(set3) f3 = open(file3, 'wb') for i in set3: f3.write(i) f3.close() if __name__ == '__main__': time1 = time.time() findSameSents(fileA, fileB, fileC) time2 = time.time() print time2 - time1
演算法3:在演算法2的基礎上,對讀取檔案資料的處理方式進一步改進,下面是改進後的程式碼,改進後執行時間僅一步縮短至100ms左右。
def findSameSents(file1, file2, file3): set1 = set() set2 = set() with open(file1, 'r') as f1: for l in f1: set1.add(l) with open(file2, 'r') as f2: for l in f2: set2.add(l) set3 = set1 & set2 print len(set3) with open(file3, 'wb') as f3: for i in set3: f3.write(i)
其中,關於演算法2中的f3.write(i)語句,為什麼沒有加入換行符,即f3.wriye(i + ‘\n’)就可以在寫入的檔案中自動換行的問題?通過單步除錯,得出如下原因,如下圖所示。
是因為,原來檔案中每行語句的末尾都包含有一個回車符\r和一個寫入的語句i裡面,而我剛開始在演算法2裡面,只是替換了其中的換行符\n,並沒有對回車符\r進行變換,所以寫入檔案的時候被行末的\r自動換行了。