Anagram Finder Python
Я хочу вернуть список слов в 'listofwords.txt', которые являются анаграммами некоторой строки 'b'
def find_anagrams(a,b): ##a is the listofwords.txt
f=open('listofwords.txt', 'r')
for line in f:
word=line.strip()
wordsorted= ''.join(sorted(line))
for word in f:
if wordsorted == ''.join(sorted(word)):
print word
Почему это просто дает мне анаграммы первого слова в списке?
Также, как я могу вернуть сообщение, если анаграммы не найдены?
2 ответа
Второй for
это неверно. И вы сравниваете слова, отсортированные с помощью ''.join(сортировка (слово)), которые являются одним и тем же. Это должно работать лучше:
def find_anagrams(a, b):
f = open(a, 'r')
for line in f:
word = line.strip()
wordsorted = ''.join(sorted(word))
if wordsorted == ''.join(sorted(b)):
print word
Теперь убедитесь, что вы закрыли файл (или, лучше, используйте with
заявление).
Изменить: о возврате сообщения, лучшее, что нужно сделать, это на самом деле вернуть список найденных анаграмм. Затем вы решаете, что делать со словами (либо распечатайте их, либо напечатайте сообщение, когда список пуст, или все, что вы хотите). Так что это может быть как
def find_anagrams(a, b):
anagrams = []
with open(a, 'r') as infile:
for line in f:
word = line.strip()
wordsorted = ''.join(sorted(word))
if wordsorted == ''.join(sorted(b)):
anagrams.append(word)
return anagrams
Тогда вы можете использовать его как
anagrams = find_anagrams('words.txt', 'axolotl')
if len(anagrams) > 0:
for anagram in anagrams:
print anagram
else:
print "no anagrams found"
Вы повторно используете файловый итератор f
во внутренней петле. Как только внутренний цикл закончен, f
будет исчерпан, и вы немедленно выйдете из внешнего цикла, так что вы фактически не пройдете первую строку.
Если вы хотите иметь два независимых цикла для всех строк в вашем файле, одним из решений (я уверен, что эта проблема может быть решена более эффективно) было бы сначала прочитать строки в списке, а затем выполнить итерации по списку:
with open('listofwords.txt') as f: # note: 'r' is the default mode
lines = f.readlines() # also: using `with` is good practice
for line in lines:
word = line.strip()
wordsorted = ''.join(sorted(line))
for word in lines:
if word == ''.join(sorted(word)):
print word
Редактировать: Мой код не решает проблему, которую вы указали (сначала я неправильно понял, см. Ответ matiasg для правильного кода), но мой ответ все еще объясняет, почему вы получаете анаграммы только для первого слова в файле.