Я предполагаю, что под «найти все возможные буквенные комбинации указанных слов» вы на самом деле имели в виду перестановки. Если это так, то вы хотите сохранить большой список слов в словаре с отсортированными буквами в качестве ключа и списком соответствующих слов (анаграмм) в качестве значений.
Затем вы можете просмотреть слова в предложении и найти запись в словаре (используя отсортированные буквы слова), чтобы получить все анаграммы.
Сортированные буквы (wordKey) могут служить идентификатором группы для слов, являющихся анаграммами друг друга. Все анаграммы приведут к единственному ключу в словаре, поэтому вам не нужно беспокоиться о перестановках.
- озеро - (сортировка букв) -> aekl: [озеро, утечка, капуста]
- утечка - (сортировка букв) -> aekl: [озеро, утечка, капуста]
капуста - (сортировка букв) -> aekl: [озеро, утечка, капуста]
Каждое слово достигает группы анаграмм, к которым оно относится, в словаре
Вот пример, из которого вы можете построить свое решение:
anagrams = dict()
for word in open("/usr/share/dict/words").read().split("\n"):
wordKey = "".join(sorted(word.lower()))
anagrams.setdefault(wordKey,[]).append(word)
sentence = "We met each other yesterday"
for word in sentence.split():
wordKey = "".join(sorted(word.lower()))
print(word, anagrams.get(wordKey,[word]))
Исходя из словаря 235K слов на моем ноутбуке, получается следующий вывод:
We ['we']
met ['met']
each ['ache', 'each', 'haec']
other ['other', 'thore', 'throe', 'toher']
yesterday ['yesterday']
Обратите внимание, что ваше решение было близко к работе.
- Переменная
f
в my_set.intersection(f)
должна была быть temp
потому что f
это просто последняя перестановка.
- Также
f
, вероятно, не содержал того, что вы ожидали.
Поскольку permutation(x)
рассматривает x
как список, он выдает результат
(temp
) это список списков, а не список строк.
- Так что если вы измените его на
my_set.intersection([ "".join(f) for f in
temp])
, оно, вероятно, будет работать.
- Это хороший пример того, как выбирать значимые имена для вашего
Переменные помогают избежать ошибок.
- Мне также интересно, вернется ли
inters
после обработки только
первое слово из набора предложений действительно то, что вы хотели сделать.
- Последняя часть напечатанного результата также подозрительна, поскольку подразумевает, что вы действительно нашли пересечение с отдельным человеком.
буквы слова «утечка». Это будет означать, что ваш файл
содержит отдельные буквы или что вы не читаете его с
соответствующая кодировка (например, Unicode читается как ASCII). Вы должны напечатать
len(my_set)
или первые несколько записей list(my_set)[:25]
, чтобы сделать
уверен, что там есть слова, а не буквы.
[ОБНОВЛЕНИЕ] Представление вывода в виде единого списка слов:
sentence = "We met each other yesterday"
result = []
for word in sentence.split():
wordKey = "".join(sorted(word.lower()))
result += anagrams.get(wordKey,[]) + [word]
print(" ".join(set(result)))
# thore each other haec we met throe toher yesterday ache
[ОБНОВЛЕНИЕ2] Прикольные предложения
Если вы хотите поиграть с результатом и построить все предложения, которые могут быть сформированы с использованием анаграмм, вам нужно будет пройти через группу анаграмм каждого слова и «умножить» комбинации на каждом шаге:
from itertools import product
from itertools import product
funkySentences = [[]]
for word in sentence.split():
wordKey = "".join(sorted(word.lower()))
alternateWords = anagrams.get(wordKey,[word])
funkySentences = [ s+[w] for s,w in product(funkySentences,alternateWords) ]
funkySentences = set(" ".join(fs) for fs in funkySentences)
for fs in funkySentences:
print(fs)
Будет напечатано:
we met haec throe yesterday
we met haec thore yesterday
we met haec toher yesterday
we met ache toher yesterday
we met haec other yesterday
we met each throe yesterday
we met each toher yesterday
we met ache other yesterday
we met each thore yesterday
we met ache throe yesterday
we met ache thore yesterday
we met each other yesterday
Вы также можете сойти с ума и изменить порядок слов, применив перестановки к каждому из этих забавных предложений:
from itertools import chain,permutations
yodaSentences = chain(*[permutations(fs.split()) for fs in funkySentences])
yodaSentences = set(" ".join(ys) for ys in yodaSentences)
for ys in yodaSentences:
print(ys)
Будет напечатано (говорит Йода):
ache we yesterday met other
other haec we met yesterday
yesterday met throe each we
haec throe yesterday met we
we yesterday met haec toher
yesterday we ache met throe
haec yesterday we other met
other yesterday met haec we
met we haec thore yesterday
each we yesterday other met
we ache yesterday other met
yesterday met toher we each
we met yesterday thore ache
... and many more ....