Вы можете создать dict word_occurs_in
, который будет хранить данные о том, какое слово встречается в каких списках, для вашего образца это будет:
{'dam': [0], 'aam': [0], 'adm': [0], 'ada': [0], 'adam': [0], 'va':
[1, 2], «ea»: [1], «ev»: [1], «eva»: [1], «aa»: [2], «av»: [2], «ava»:
[2]}
Затем вы можете создать новый диктант, назовем его result
, в котором вы должны сохранить конечный результат, например, {0: [], 1: [2], 2: [1]}
в вашем случае.
Теперь, чтобы получить result
из word_occurs_in
, вы должны просмотреть значения word_occurs_in
и посмотреть, есть ли в списке более одного элемента. Если это так, то вам просто нужно добавить все остальные значения, кроме значения наблюдаемого в данный момент ключа в result
. Например, при проверке значения [1, 2]
(для ключа 'va'
) вы 'добавите 1
к значению, соответствующему 2
в result
dict, и добавите 2
к значению, соответствующему ключ 1
. Надеюсь, это поможет.
В моем понимании, самая большая сложность вашего кода заключается в повторении списка из 40 тыс. Записей дважды, поэтому этот подход повторяет список только один раз, но использует немного больше места.
Возможно, я не объяснил себя достаточно, поэтому вот код:
from collections import defaultdict
lst = [['dam', 'aam', 'adm', 'ada', 'adam'], ['va', 'ea', 'ev', 'eva'], ['va', 'aa', 'av', 'ava']]
word_occurs_in = defaultdict(list)
for idx, l in enumerate(lst):
for i in l:
word_occurs_in[i].append(idx)
print(word_occurs_in)
result = defaultdict(list)
for v in word_occurs_in.values():
if len(v) > 1:
for j in v:
result[j].extend([k for k in v if k != j])
print(result)