2015-07-10 38 views
1

我想創建一個Python程序來在文本文件中查找一行中的唯一字。在一行文本文件中查找多個唯一字

文本文件「詳細信息」具有以下行

My name is crazyguy 
i am studying in a college and i travel by car 
my brother brings me food for eating and we will go for shopping after food. 

它必須返回輸出

4 
10 #(since i is repeated) 
13 #(Since food and for are repeated) 

如果代碼工作,將它的工作方式相同更大的文本文件中挖掘數據?

+0

我建議你看看NLTK,python中的純腳本在處理大文件時效率不高。 – Leb

+0

簡單。對於每一行,創建一個集合容器。標記行(例如基於空格),並將每個標記放入集合中。然後,計算該組中元素的數量。 – Santa

+2

@Leb - NTLK在這裏似乎不是必要的。 – TigerhawkT3

回答

4

你可以使用在所有的線路導線設置拆分創建lsit並使其設置爲找到獨特的價值,並發現它的Count

with open("filename","r") as inp: 
    for line in inp: 
     print len(set(line.split())) 
+1

順便提一句,你在':'之前有';'。 – TigerhawkT3

+0

@ TigerhawkT3錯字謝謝 – The6thSense

5
with open('details.txt', 'r') as f: 
    for line in f: 
     print(len(set(line.split()))) 
+0

同樣的頭腦想象:p – The6thSense

+2

@Vignesh - Yep;這裏沒有太多的獨特算法空間。 – TigerhawkT3

+0

@ TigerhawkT3:這是一個挑戰嗎? –

3

有解決方案的整個世界是有過之而無不及TigerhawkT3/Vignesh Kalai的解決方案。作爲比較:

>>> timeit.timeit("len(set(string.split()))", "string=\""+string+"\"") 
9.243406057357788 

是它們的實現。其實我有這一個寄予厚望:

>>> timeit.timeit("len(set(map(hash,string.split())))", "import numpy\nstring=\""+string+"\"") 
14.462514877319336 

因爲在這裏,在set只建在哈希值。 (因爲哈希值是數字,所以他們不需要自己散列,或者我希望是這樣。在set中的類型處理可能仍然會殺死我;否則,從理論上講,計算的哈希數將與最好的解決方法,但是PyObject在下面玩雜耍的可能會少一些,我錯了。)

所以我試着用numpy處理哈希;首先用原始字符串進行比較:

>>> timeit.timeit("len(numpy.unique(string.split()))", "import numpy\nstring=\""+string+"\"") 
33.38827204704285 
>>> timeit.timeit("len(numpy.unique(map(hash,string.split())))", "import numpy\nstring=\""+string+"\"") 
37.22595286369324 
>>> timeit.timeit("len(numpy.unique(numpy.array(map(hash,string.split()))))", "import numpy\nstring=\""+string+"\"") 
36.20353698730469 

最後的手段:計數器可能會簡單地繞過還原步驟。但話又說回來,Python中的字符串只是PyObjects,你真的不具有的dict代替set獲得:

>>> timeit.timeit("max(Counter(string.split()).values())==1", "from collections import Counter\nstring=\""+string+"\"") 
46.88196802139282 
>>> timeit.timeit("len(Counter(string.split()))", "from collections import Counter\nstring=\""+string+"\"") 
44.15947103500366 

順便說一句:最佳的解決方案的一半時間進入分裂:

>>> timeit.timeit("string.split()", "import numpy\nstring=\""+string+"\"") 
4.552565097808838 

,並與直覺相反,如果您指定要沿着空間分割(而不是所有典型的分隔符)在上述時間甚至增加:

>>> timeit.timeit("string.split(' ')", "import numpy\nstring=\""+string+"\"") 
4.713452100753784 
+0

相當不錯的分析:) – The6thSense

相關問題