2015-07-10 96 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

相关问题