讀取某一簡單索引文件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
現在我們得到了正確的字典,我們已經很接近最后的程序了。
我們還需要做一個事情,計數,顯然是字典中的計數,讓我們先找一下字典中有沒有這樣的方法。
對,這並不是字典中的問題,字典中的每一個Key對應一個value ,但是,它的每個值是一個list,那么,這個問題划歸到list中有多少個對象的問題了。
so easy~
len( result[ key ] )
讓我們整理一下輸出.
for key in result.keys(): print '%d %s => %s ' % (len(result[key]),key,result[key] )
現在看來是那么回事了. 現在給出所有的代碼.
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