Напишите функцию с именем 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  

Kamran Raza

Ответов: 2

Ответы (2)

Версия без импорта:

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. Он ищет ключ и возвращает значение, если ключ есть. Если он не может найти ключ, он возвращает новый список, который можно немедленно добавить.

Вы близки - вам нужно использовать 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

2022 WebDevInsider