Anagram解决错误python

时间:2012-01-14 18:43:19

标签: python algorithm io anagram equation-solving

我写了一个anagram求解算法,但不起作用。

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

我需要使用len(word) - 1去掉\ n。

2 个答案:

答案 0 :(得分:7)

(1)我不理解你的第一个循环中“len(word)-1”中的“-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 :(得分:1)

正如评论中所提到的那样,突然出现的两个弊端是:

  1. 为什么:如果len(字) - 1 == len(anagram)?
  2. 在迭代它时缩短列表是一个很大的诺言。该行possible.remove(word)应该更改。
  3. 这样的事情:

    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