Функция возвращающая список анаграмм из заданного слова
Рекомендую присмотреться к модулю itertools, в частности, функции permutations. Примерный код:
import itertools
def anagrams(word):
for permutation in itertools.permutations(word):
yield ''.join(permutation)
for word in anagrams('car'):
print(word)
car
cra
acr
arc
rca
rac
В случае повторения букв в слове анаграммы тоже будут содержать дубли:
>>> for word in anagrams('rar'):
print word
rar
rra
arr
arr
rra
rar
Функция сравнивающая два списка и возвращающая совпадения
Если я правильно понял, вы держите в памяти списки анаграмм и словарных слов и ищете (линейным поиском) их пересечение. Это, на мой взгляд, не вполне эффективно. Я бы поступил так:
words=['car','arc','cat','map','toster']
wordset=set(words)
for word in anagrams('car'):
if word in wordset:
print ("word %s matched vocabulary" % word)
Если и этого не хватит, то можно будет, на мой взгляд, подумать об использовании фильтров Блума.
UPD: Как я понял, основная проблема в количестве анаграмм.
Вводим слово
Из введённого слова делаем анаграммы
Вы можете с самого начала для каждого слова из словаря запомнить его 'отсортированный' вариант:
words=['car','arc','cat','map','toster']
sortedwordset=set(''.join(sorted(w)) for w in words)
>>> sortedwordset
set(['acr', 'eorstt', 'amp', 'act'])
Тогда для каждого введенного слова можно проверить, имеет ли смысл составлять анаграммы:
if ''.join(sorted(word)) in sortedwordset:
#continue with anagrams
UPD2: Можно, на мой взгляд, сделать так: для каждого слова из словаря формируется его 'отсортированная' форма. Эта форма будет ключом словаря, а значением - список словарных слов, являющихся анаграммами этой формы. Тогда за счет предварительных вычислений можно будет быстро искать словарные анаграммы:
def sorted_string(s):
return ''.join(sorted(s))
words=['car','arc','cat','map','toster']
d={}
for word in words:
sorted_word=sorted_string(word)
if sorted_word in d:
d[sorted_word].append(word)
else:
d[sorted_word]=[word]
>>> d
{'acr': ['car', 'arc'], 'eorstt': ['toster'], 'amp': ['map'], 'act': ['cat']}
>>> d.get(sorted_string('car'),[])
['car', 'arc']
>>> d.get(sorted_string('cat'),[])
['cat']
>>> d.get(sorted_string('perkele'),[])
[]