我如何索引每一行的单词

时间:2016-01-01 22:41:09

标签: python dictionary indexing

  

编写一个名为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  

2 个答案:

答案 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词典方法。它查找键并在键存在时返回值。如果它找不到密钥,它将返回一个可以立即附加到的新列表。