编写一个名为lineIndex的函数,该函数采用文件名fName, 作为参数并返回一个字典,d,索引 fName中的单词由行号表示,第一行在fName中 被编号为0。 fName中的每个单词都应该是返回字典d中的一个键, 相应的值应该是行号列表 这个词出现的地方。不应再出现行号 在给定的行号列表中不止一次。**
我尝试了很多方法但找不到解决方案。
我所取得的成就,我不知道如何删除重复的单词。
def lineindex(fname):
ifile=open(fname, 'rt')
readfile = ifile.readlines()
d = {}
fst=[]
for line in readfile:
#print(readfile[0][0])
#print(readfile.index(line))
#print(line)
split=line.split()
for word in split:
if word not in d:
d[word] = line.index(word)
else:
return d
示例输入
I have no pride
I have no shame
You gotta make it rain
Make it rain rain rain
正确输出
{'rain': [2, 3], 'gotta': [2], 'make': [2], 'it': [2, 3], 'shame': [1], 'I': [0,1], 'You': [2], 'have': [0, 1], 'no': [0,1], 'Make': [3], 'pride': [0]}
编辑2:
def lineindex(fname):
ifile=open(fname, 'rt')
readfile = ifile.readlines()
d = {}
for line in readfile:
#print(line, readfile.index(line))
words=line.split()
for word in words:
#print(word, readfile.index(line))
if word not in d:
d[word] = readfile.index(line)
else:
return d
答案 0 :(得分:1)
你很接近 - 你需要利用的是一个set
- 它每个键只能包含一个唯一的元素 - 所以你将为你处理重复的单词。您还错过了代码中的行号,因此请查看enumerate
。然后,您可以查看collections.defaultdict
,它为您不存在的密钥创建默认值。
from collections import defaultdict
def lineindex(fname):
dd = defaultdict(list)
with open(fname) as fin:
for lineno, line in enumerate(fin):
for word in set(line.split()):
dd[word].append(lineno)
return dd
纯粹使用内置,然后:
def lineindex(fname):
dd = {}
with open(fname) as fin:
for lineno, line in enumerate(fin):
for word in set(line.split()):
dd.setdefault(word, []).append(lineno)
return dd
答案 1 :(得分:0)
没有导入的版本:
def lineindex(fname):
d = {}
with open(fname) as fobj:
for lineno, line in enumerate(fobj):
for word in set(line.split()):
d.setdefault(word, []).append(lineno)
return d
>>> lineindex('sample.txt') == out
True
您可以使用setdefault词典方法。它查找键并在键存在时返回值。如果它找不到密钥,它将返回一个可以立即附加到的新列表。