Определить номера текстов в которых встречается слово

Даны тексты:

text1 = "Шла Саша по шоссе"
text2 = "Ехал Грека через реку"
text3 = "Где труд там и счастье"
text4 = "Доброта и труд рядом живут"
text5 = "Без труда не выловишь и рыбку из пруда"

Необходимо создать список из словарей следующего вида:

result = [{"word": "труд",    "count": 3, "id": [2, 3, 4]}, 
          {"word": "доброта", "count": 1, "id": [3]},
          .....
         ]

Подскажите, как посчитать количество повторений слова и в каких текстах оно используется, учитывая, что в конечном списке словарей слова должны быть в начальной форме (т.е. не "труда", а "труд").

Есть пример функции:

def f(texts, word):
    res = {"word":word, "count":0, "id":[]}
    
    for key, value in texts.items():
        n = value.count(word)
        if n:
            res["count"] += n
            res["id"].append(key)
    return res

Но тут подсчет слов идет только слово в слово, то есть для слова "труд" будут созданы два словаря с двумя формами этого слова.


Ответы (1 шт):

Автор решения: Zhihar

такой вариант устроит (специально не стал сокращать):

texts = [
    "Шла Саша по шоссе",
    "Ехал Грека через реку",
    "Где труд там и счастье",
    "Доброта и труд рядом живут",
    "Без труда не выловишь и рыбку из пруда",
]

tmp = dict()

for text in enumerate(texts):
    for word in text[1].split():
        if word not in tmp:
            tmp[word] = {"word": word, "count": 1, "id": [text[0]]}
        else:
            tmp[word]["count"] += 1
            tmp[word]["id"] += [text[0]]

res = []
for key in tmp:
    tmp[key]["id"].sort()
    res.append(tmp[key])

print(res)

можно чуть-чуть покороче

tmp = dict()

for text in enumerate(texts):
    for word in text[1].split():
        if word not in tmp:
            tmp[word] = {"word": word, "count": 1, "id": [text[0]]}
        else:
            tmp[word]["count"] += 1
            tmp[word]["id"] = sorted(tmp[word]["id"] + [text[0]])

res = list(tmp.values())

print(res)

Если нужна сортировка по кол-ву попаданий, то можно такой код использовать:

res = sorted(list(tmp.values()), key=lambda obj: -obj['count'])
→ Ссылка