← Все вопросы
Как построить «обратный индекс» слово → список позиций в тексте?
11
Хочу для каждого слова знать, на каких позициях (индексах) оно встречается в списке слов. Одно слово может повторяться несколько раз.
words = ["кот", "пёс", "кот", "мышь", "кот"]
# нужно {"кот": [0, 2, 4], "пёс": [1], "мышь": [3]}
2 ответа
20
✓ Принятый ответ — помог автору
enumerate даёт индекс, а defaultdict(list) копит позиции:
from collections import defaultdict
index = defaultdict(list)
for i, w in enumerate(words):
index[w].append(i)
# {'кот': [0, 2, 4], 'пёс': [1], 'мышь': [3]}
Это и есть мини-версия инвертированного индекса, как в поисковиках: по слову сразу получаешь, где оно встречается. Позиции лежат по возрастанию, потому что ты идёшь по тексту слева направо.
6
То же без импорта: в цикле index.setdefault(w, []).append(i).
Ваш ответ
Войдите, чтобы ответить на вопрос.