大家好,我正在上课,我们的任务之一就是创建一个Hangman AI。这个任务有两个部分,目前我被困在第一个任务上,即,给定了刽子手谜题的状态,以及作为字典的单词列表,从字典中过滤掉谜题的不可能答案。举个例子,如果给出的拼图是t-t,那么我们应该过滤掉所有不是4个字母的单词。接下来,我们应该过滤掉没有t作为第一个和最后一个字母的单词(即帐篷和测试是可接受的,但应删除类型和帮助)。目前,由于某种原因,我的代码似乎从字典中删除所有条目,我不知道为什么。非常感谢帮助。我还附上了我的代码以供参考。
def过滤器(自我,拼图):
wordlist = dictionary.getWords()
newword = {i : wordlist[i] for i in range(len(wordlist)) if len(wordlist[i])==len(str(puzzle))}
string = puzzle.getState()
array = []
for i in range(len(newword)):
n = newword[i]
for j in range(len(string)):
if string[j].isalpha() and n[j]==string[j]:
continue
elif not string[j].isalpha():
continue
else:
array+=i
print(i)
break
array = list(reversed(array))
for i in array:
del newword[i]
其他一些信息:
puzzle.getState()是一个给我们的函数,它返回一个描述拼图状态的字符串,例如。 a-a ---或t --- t-或elepha -
dictionary.getWords实质上是从单词列表中创建一个字典
谢谢!
答案 0 :(得分:1)
这一行
newword = {i : wordlist[i] for i in range(len(wordlist)) if len(wordlist[i])==len(str(puzzle))}
创建一个包含非连续键的字典。您只需要与puzzle
长度相同的字词,因此如果wordlist
为['test', 'type', 'string', 'tent']
且puzzle
为4个字母,则newword
为{0:'test', 1:'type', 3:'tent'}
}。然后使用for i in range(len(newword)):
根据字典的长度迭代字典。我有点惊讶你没有用你的代码写出KeyError。
我没有其他代码就无法测试,但我认为将循环更改为:
for i in newword.keys():
会有所帮助。
答案 1 :(得分:1)
这可能有点晚,但使用正则表达式:
import re
def remove(regularexpression, somewords):
words_to_remove=[]
for word in somewords:
#if not re.search(regularexpression, word):
if re.search(regularexpression, word)==None:
words_to_remove.append(word)
for word in words_to_remove:
somewords.remove(word)
例如,您有列表words=['hello', 'halls', 'harp', 'heroic', 'tests']
。
您现在可以:
remove('h[a-zA-Z]{4}$', words)
和words
将成为['hello', 'halls']
,而remove('h[a-zA-Z]{3}s$', words)
仅将words
留给['halls']