我想创建一个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)
如果代码有效,那么在挖掘数据时,它对于更大的文本文件是否会以相同的方式工作?
答案 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