CDays-3 習題二 (字典及文件讀取練習)及相關內容解析。Python 基礎教程


讀取某一簡單索引文件cdays-3-test.txt,其每行格式為文檔序號 關鍵詞,現需根據這些信息轉化為倒排索引,即統計關鍵詞在哪些文檔中,格式如下:包含該關鍵詞的文檔數 關鍵詞 => 文檔序號。其中,原索引文件作為命令行參數傳入主程序,並設計一個collect函式統計 "關鍵字<->序號" 結果對,最后在主程序中輸出結果至屏幕。

在附錄中,我們給出該文件內容。

好了,讓我們分析這個問題。 先理解“倒排索引”的概念。就是把Key變成索引。

這樣的數據結構我們可以用字典來實現,因為我們不知道要有多少個表,要有多少個數組。

我們找到一個關鍵詞就新建一個Key ,Value中存放序號,如果字典中存在這個key ,那么擴增value ,由於是list,所以我們用列表方法append

我們假定文件存儲在  D:\\Days-3-test.txt

而且要用函數來解決這個問題。

location='D:\\Days-3-test.txt'

def collect(file):
    result = {}   #  定義一個空字典
    for line in file.readlines( ):
        left,right = line.split( )
        if right in result :
            result[right].append(left)  #添加進列表
        else:
            result[right]=[left]        #如果字典中沒有該值,那么新建一個Key
    return result

a_file=open(location,'r')
result = collect(open(location,'r'))    #讀取文件
print result

image

現在我們得到了正確的字典,我們已經很接近最后的程序了。

我們還需要做一個事情,計數,顯然是字典中的計數,讓我們先找一下字典中有沒有這樣的方法。

對,這並不是字典中的問題,字典中的每一個Key對應一個value ,但是,它的每個值是一個list,那么,這個問題划歸到list中有多少個對象的問題了。

so easy~

len( result[ key ] )

讓我們整理一下輸出.

for key in result.keys():
    print '%d %s   =>   %s ' % (len(result[key]),key,result[key] )

image

現在看來是那么回事了. 現在給出所有的代碼.

location='D:\\Days-3-test.txt'

def collect(file):
    result = {}   #  定義一個空字典
    for line in file.readlines( ):
        left,right = line.split( )
        if right in result :
            result[right].append(left)  #添加進列表
        else:
            result[right]=[left]        #如果字典中沒有該值,那么新建一個Key
    return result

for key in collect(open(location,'r')).keys():
    print '%d %s   =>   %s ' % (len(result[key]),key,result[key] )

現在看來文件類的問題並不是那么麻煩了。

 

附錄1. Days-3-test.txt 文件內容. 

1 key1
2 key2
3 key1
7 key3
8 key2
10 key1
14 key2
19 key4
20 key1
30 key3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM