Анаграмма, решающая ошибку python - PullRequest
0 голосов
/ 14 января 2012

Я написал алгоритм решения анаграмм, который не работает.

for word in wordlist: #Checking for equal length
    if sorted(word.replace("\n", "")) == sorted(anagram):
        possible.append(word)

Мне нужно было использовать len (слово) - 1, чтобы убрать \ n.

Ответы [ 2 ]

7 голосов
/ 14 января 2012

(1) Я не понимаю "-1" в "len (word) -1" в вашем первом цикле.

(2) У вашего второго цикла есть несколько проблем:

Он не проверяет, совпадают ли буквы, он проверяет, находится ли каждая буква в анаграмме в слове.Вы не используете информацию счета, поэтому вы не можете различить Бок и книгу.Вы также удаляете из последовательности, которую вы повторяете, что приводит к неожиданному поведению.

С моей стороны, я бы просто использовал

sorted_anagram = sorted(anagram)
possibles = [word for word in wordlist if sorted(word) == sorted_anagram]

вместо явного для циклов.

Обратите внимание, что сортировка слов является своего рода процессом канонизации - он гарантирует, что любые два слова, которые являются анаграммами друг друга, будут в одном и том же формате.Другой подход, позволяющий определить, являются ли две вещи анаграммами, состоит в том, чтобы убедиться, что количество букв одинаково:

>>> from collections import Counter
>>> Counter('book')
Counter({'o': 2, 'k': 1, 'b': 1})
>>> Counter('obko')
Counter({'o': 2, 'k': 1, 'b': 1})
>>> Counter('bok')
Counter({'k': 1, 'b': 1, 'o': 1})
>>> 
>>> Counter('book') == Counter('boko')
True
>>> Counter('book') == Counter('bok')
False
1 голос
/ 14 января 2012

Как уже упоминалось в комментариях, два зла, которые бросаются на меня:

  1. Почему: если len (слово) - 1 == len (анаграмма)?
  2. Сокращение списка при его повторении - большой ноно. Эта строка possible.remove(word) должна быть изменена.

Как насчет этого:

anagramLength = len(anagram) # Get the value once to save CPU
possible1 = [word for word in wordlist if len(word)-1 == anagramLength] # List iteration
possible2 = [] # Make a new list that will be more constricted
for word in possible: #Checking for same letters
    for letter in anagram:
        if letter not in word:
            break
    else:
        possible2.append(word) # Only called if you don't break the above for loop

Ссылки на используемые инструменты:

  1. listIteration
  2. for..else
...