2015-03-08 5 views
-1

Я хочу, чтобы вернуть список слов в «listofwords.txt», которые являются анаграммы некоторой строки «б»Anagram Finder Python

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 

Почему это просто дает мне анаграммы первого слова в список?

Также как я могу вернуть сообщение, если анаграммы не найдены?

+0

Где вы можете использовать 'a' или' b'? –

ответ

1

Неверный номер 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" 
+0

Знаете ли вы, что такое 'b'? – mkrieger1

+0

это слово, чтобы найти анаграммы для. – matiasg

+0

nevermind, я просто прочитал описание вопроса ... – mkrieger1

0

Вы повторно использовать файл итератор 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 

Edit: Мой код не решает эту проблему вы указывали (я понял это первым, см ответа matiasg в для правильного кода), но мой ответ еще объясняет, почему вы получите только анаграммы для первого слова в файле.