创建单词索引

0 投票
4 回答
10885 浏览
提问于 2025-04-17 18:37

我现在正在尝试创建一个单词索引,方法是从文本文件中读取每一行,并检查这个单词是否在这一行中。如果找到了,就打印出行号,然后继续检查。我已经成功地让它在打印每个单词和行号时按我想要的方式工作,但我不太确定可以用什么存储系统来保存每个行号。

代码示例:

def index(filename, wordList):
    'string, list(string) ==> string & int, returns an index of words with the line number\
    each word occurs in'
    indexDict = {}
    res = []
    infile = open(filename, 'r')
    count = 0
    line = infile.readline()
    while line != '':
        count += 1
        for word in wordList:
            if word in line:
                #indexDict[word] = [count]
                print(word, count)
        line = infile.readline()
    #return indexDict

这段代码会打印出单词和当时的计数(行号),但我想要的是把这些行号存起来,以便后面可以打印出来

word linenumber

word2 linenumber, linenumber

等等。我觉得用字典会比较合适,如果把每个行号放在一个列表里,这样每个键就可以包含多个值,但我目前做到的只是这样:

{'mortal': [30], 'dying': [9], 'ghastly': [82], 'ghost': [9], 'raven': [120], 'evil': [106], 'demon': [122]}

我希望它能显示成:

{'mortal': [30], 'dying': [9], 'ghastly': [82], 'ghost': [9], 'raven': [44, 53, 55, 64, 78, 97, 104, 111, 118, 120], 'evil': [99, 106], 'demon': [122]}

有什么好的建议吗?

4 个回答

2

可能有更符合Python风格的方法来写这个,但为了让人更容易理解,你可以试试这样写(这是一个简单的例子):

dict = {1: [], 2: [], 3: []}

list = [1,2,2,2,3,3]

for k in dict.keys():
    for i in list:
        if i == k:
            dict[k].append(i)


In [7]: dict
Out[7]: {1: [1], 2: [2, 2, 2], 3: [3, 3]}
3

你可以试试这样做:

import collections
def index(filename, wordList):
    indexDict = collections.defaultdict(list)
    with open(filename) as infile:
        for (i, line) in enumerate(infile.readlines()):
            for word in wordList:
                if word in line:
                    indexDict[word].append(i+1)
    return indexDict

这样做的结果和你例子中的结果是完全一样的(使用的是Poe的Raven)。

另外,你也可以考虑用普通的 dict 来代替 defaultdict,并且把列表中的所有单词都放进去初始化;这样可以确保 indexDict 里即使是那些不在文本中的单词也会有记录。

还有,注意使用 enumerate 这个内置函数。它非常有用,可以让你在遍历列表时,同时获取每个元素的索引和对应的值(比如文件中的每一行)。

2

你正在用这一行代码替换旧的值

indexDict[word] = [count]

把它改成

indexDict[word] = indexDict.setdefault(word, []) + [count]

就能得到你想要的结果。它会获取当前 indexDict[word] 的值,并把新的计数加到这个值上。如果 indexDict[word] 不存在,它会创建一个新的空列表,然后把计数加到这个列表里。

撰写回答