2015-03-09 2 views
1

Я пытаюсь создать скрипт, где я могу ввести анаграмму любого слова, и он будет читать из словаря, чтобы узнать, есть ли соответствие (например, estt возвращает : = unjumble слова: тест)Anagram не соответствует up (строка в список), Python

Если есть два матча он запишет (Исх estt возвращается:. есть несколько совпадений: тест, брусчатка (при условии, брусчатка слово лол)

Я не мог даже получить один матч, продолжает возвращаться «без матча», хотя, если я посмотрю на свой список, сделанный из словаря, я вижу слова.

H ere код, который я написал до сих пор

def anagrams(s): 
    if s =="": 
     return [s] 
    else: 
     ans = [] 
     for w in anagrams(s[1:]): 
      for pos in range(len(w)+1): 
       ans.append(w[:pos]+s[0]+w[pos:]) 
      return ans 

dic_list = [] 
def dictionary(filename): 
    openfile = open(filename,"r") 
    read_file = openfile.read() 
    lowercase = read_file.lower() 
    split_words = lowercase.split() 
    for words in split_words: 
     dic_list.append(words) 

def main(): 
    dictionary("words.txt") 
    anagramsinput = anagrams(input("unjumble words here: ")) 
    for anagram in anagramsinput: 
     if anagram in dic_list: 
      print(anagram) 
     else: 
      print("no match") 
      break 

Это как если бы анаграмма не была в dic_list. что происходит?

+0

Можем ли мы увидеть words.txt –

+0

Я сделал это очень мало. https://docs.google.com/file/d/0B4dH2vTP52jxMzJROXd5akNlOEtHbGl1bjl4TGI5OHkyMmQw/edit?usp=docslist_api – Archie

+0

Вы проверили, что dic_list содержит правильные значения? –

ответ

0

Вы нарушаете после одной проверки в цикле, удалите break, чтобы получить все анаграммы:

def main(): 
    dictionary("words.txt") 
    anagramsinput = anagrams(input("unjumble words here: ")) 
    for anagram in anagramsinput: 
     if anagram in dic_list: # don't break, loop over every possibility 
      print(anagram) 

Если вы не хотите, чтобы напечатать не ровня просто удалить его, а также, если вы хотите, чтобы все это возможно перестановки букв используют itertools.permutations:

from itertools import permutations 
def anagrams(s): 
    return ("".join(p) for p in permutations(s)) 

Выход:

unjumble words here: onaacir 
aaronic 

В ваших анаграмм функции вы возвращаете, прежде чем закончить поэтому внешний цикл отсутствует множество перестановок:

def anagrams(s): 
    if s =="": 
     return [s] 
    else: 
     ans = [] 
     for w in anagrams(s[1:]): 
      for pos in range(len(w)+1): 
       ans.append(w[:pos]+s[0]+w[pos:]) 
     return ans # only return when both loops are done 

Теперь после того, как меняется ваш код будет работать

+0

Я не хочу, чтобы он печатал Нет совпадения 5 раз, если я помещаю слово, которое можно скремблировать 5 раз. Если я не стану перерыв, я все равно получаю «нет совпадения» – Archie

+0

@Archie. вы разбиваете цикл на первой итерации независимо от того, что –

+0

Спасибо, Может быть, я мог бы поставить результат первым. затем выполните еще один оператор соответствия после. Я все еще не могу заставить код работать, но он ничего не получает – Archie

Смежные вопросы