创建单词索引
我现在正在尝试创建一个单词索引,方法是从文本文件中读取每一行,并检查这个单词是否在这一行中。如果找到了,就打印出行号,然后继续检查。我已经成功地让它在打印每个单词和行号时按我想要的方式工作,但我不太确定可以用什么存储系统来保存每个行号。
代码示例:
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] 不存在,它会创建一个新的空列表,然后把计数加到这个列表里。