据我所知,你需要的是每个单词的行列表,而不仅仅是遇到该单词的最后一行。如果是这样,那么word_map应该是从单词到行号列表的映射,而不仅仅是单个行号的映射。因此,为单词添加行号的行现在是word_map[word]+=[line_no]。为了避免写defaultdict部分,使用了defaultdict而不是一个简单的字典。在
下面是一个工作版本:import string, collections
def build_word_index():
input_file=(input('file name: '))
input_file_open=open(input_file,'r')
word_map = collections.defaultdict (list)
line_no = 0
w=[]
for line in input_file_open:
word_lst = line.strip().split()
word_lst = [w.lower().strip(string.punctuation) for w in word_lst]
w.append(word_lst)
for word in word_lst:
word_map[word]+=[line_no]
line_no+=1
print(word_map)
index_lst = sorted(list(word_map.items()))
print(index_lst)
for word, line_set in index_lst:
line_lst = sorted(list(line_set))
line_str = str( line_lst[0] )
for line_no in line_lst[1:]:
line_str += ", {}".format( line_no )
print("{:14s}:".format(word), line_str )
input_file_open.close()
build_word_index()
输入示例:
^{pr2}$
输出示例:file name: defaultdict(, {'one': [0, 2], 'three': [1, 1, 3], 'two': [0, 2], 'four': [1, 2, 3]})
[('four', [1, 2, 3]), ('one', [0, 2]), ('three', [1, 1, 3]), ('two', [0, 2])]
four : 1, 2, 3
one : 0, 2
three : 1, 1, 3
two : 0, 2