在一行文本文件中查找许多唯一的单词

时间:2015-07-10 18:13:56

标签: python text

我想创建一个Python程序来查找文本文件中一行中的唯一单词。

文本文件“details”有以下几行

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)

如果代码有效,那么在挖掘数据时,它对于更大的文本文件是否会以相同的方式工作?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

您可以使用set traverse遍历所有行拆分来创建lsit并使其设置为查找唯一值并找到它的计数

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

答案 2 :(得分: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