我在python中做一个简单的程序来欺骗scrabble
def scrabble_master():
dictionary = open('dictionary.txt') #line by line english dictionary
letters = raw_input('Which letters do you have?' )
letters_list = []
current_line = dictionary.next()
for slice in letters:
letters_list.append(slice)
for current_line in dictionary :
current_letters = []
current_word = []
for slice in current_line :
current_word.append(slice)
for slice in letters :
current_letters.append(slice) # creates two working lists
if len(letters_list) >= len(current_word) -1 : #finds eligible words
for slice in current_letters :
if slice in current_word :
current_letters.remove(slice)
current_word.remove(slice) #compares lists
#print current_word<------ for testing
#print current_letters<------ for testing
if current_word == ['\n'] :
print current_line #if lists are same
else : #you can spell that
pass #word
else :
pass
如果你想要找到&lt; = 3个字符长的单词,它可以正常工作,它也适用于其他单词但我的循环似乎只经历了3次。我在IDLE工作,我通过查看标记为“for testing”的打印语句的输出得出了这个结论,我可能是错的。
无论如何它只适用于少于三个字母的单词,只是想知道我做了什么导致这种行为
答案 0 :(得分:1)
您的代码中存在许多小问题。
首先,在第5行,你调用current_line = dictionary.next()
,但在循环中你应该循环遍历字典的所有行。
接下来,字符串本身是可迭代的,因此您不必创建逐个字符拆分的列表。换句话说,这是有效的python:
>>> word = 'hello'
>>> for letter in word:
print letter
h
e
l
l
o
一个问题是remove
方法不适用于字符串。相反,您可以使用replace
。等价物是.replace(letter, '', 1)
,其中最后一个参数指定它应该只执行一次。请注意,这会返回字符串的新副本,因此您需要执行word = word.replace(letter, '', 1)
。
一个小问题是你没有“消毒”输入。理想情况下,如果您的用户输入cidzouf
或c, i, d, z, o, u, f
,它应该相同,因为您没有指定字母的格式。字符串方法translate
在这里很有用,可以删除空格和逗号,或者用户可能输入的任何其他符号。
最后,您不应该害怕添加更多调试语句以确保发生了什么。我的猜测是,通过添加更多print
s,你会自己发现问题。无论如何,我用这些建议重写了你的功能,它似乎适用于我尝试的几个测试用例(和我试过的测试词典):
def scrabble_master():
dictionary = open('dictionary.txt') # line by line english dictionary
letters = raw_input('Which letters do you have? ')
matches = [] # save a list of all matches so you can print them out later
for word in dictionary:
current_word = word.rstrip() # remove the newline character
print 'testing word:', current_word
current_letters = letters # make a copy of the letters
if len(letters) >= len(current_word): # find eligible words
for letter in current_letters:
if letter in current_word:
# remove the first instance of the letter:
current_letters = current_letters.replace(letter, '', 1)
current_word = current_word.replace(letter, '', 1)
print 'current_word:', current_word
print 'current_letters:', current_letters
if current_word == '':
print 'match =', word
matches.append(word.rstrip())
print matches