0

我写了一个字谜求解算法,它不起作用。

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

我需要使用 len(word) - 1 来删除 \n。

4

2 回答 2

7

(1) 我不明白您的第一个循环中“len(word)-1”中的“-1”。

(2) 你的第二个循环有几个问题:

它不检查字母是否相同,而是检查字谜中的每个字母是否在单词中。您没有使用计数信息,因此您无法区分 bok 和 book。您还从正在迭代的序列中删除,这会导致意外行为。

就我而言,我只是使用

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

而不是显式的 for 循环。

请注意,对单词进行排序是一种规范化过程——它确保任何两个互为变位词的单词都具有相同的格式。确定两件事是否是字谜的另一种方法是确保字母数相同:

>>> 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
于 2012-01-14T18:51:13.003 回答
1

正如评论中提到的那样,我跳出来的两个邪恶是:

  1. 为什么这样做:如果 len(word) - 1 == len(anagram) ?
  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. 列表迭代
  2. 对于..其他
于 2012-01-14T19:02:36.310 回答