我有一个文本文件,其中每一行都有一堆文本。(在实际文件中没有行号)像这样:
行#:文本: 0 这是一些文字 1 更多文字 2 午餐吃什么
我想要一个函数,它返回一个字典,将每个单词映射到它的行号出现,本质上是设计一个逆索引。
IE{'This':{1}, 'text':{0,1}, 'for':{2} ... }
扫描文本文件后(这需要 0.18 秒),我将这些行放入列表列表中,以便列表中的每个位置存储分割线。IE:
[['This', 'is', 'some', 'text'], ['More', ...] ...]
之后我enumerate()
用来提取位置并创建字典。我已经有了一个解决方案,但它太丑了,我花了很长时间,以至于我想看到另一个更优雅的解决方案。
作为参考,我的算法在 1099 行和 753210 个单词上运行了 882.28 秒,即 15 分钟。换句话说,绝对不是pythonic。
def invidx(strlist):
# return algoritm execution time
start = time.time()
f = open(strlist, 'r')
wordLoc = []
for line in f:
s = line.split()
wordLoc.append(list(s))
f.close()
# benchmark
print 'job completed in %.2fs' % (time.time() - start)
try:
q = {}
for a, b in enumerate(wordLoc):
l = set()
for w in b :
if w not in q:
l = {a for a, b in enumerate(wordLoc) if w in b}
q[w] = l
except KeyboardInterrupt:
print 'Interrupt detected: aborting...'
print 'Failed to complete indexing, ran for %.2fs' % \
(time.time() - start)
exit(0)
return q
编辑:
根据上面的请求代码。伙计们,对我轻点。