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 для правильного кода), но мой ответ все еще объясняет, почему вы получаете анаграммы только для первого слова в файле.

Другие вопросы по тегам