1. 程式人生 > >尋找兩個檔案中相同的句子

尋找兩個檔案中相同的句子

先介紹問題描述:

已有兩個檔案a.datb.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自動換行了。