循环工作3次然后退出

时间:2013-01-13 15:28:02

标签: python

我在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”的打印语句的输出得出了这个结论,我可能是错的。

无论如何它只适用于少于三个字母的单词,只是想知道我做了什么导致这种行为

1 个答案:

答案 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)

一个小问题是你没有“消毒”输入。理想情况下,如果您的用户输入cidzoufc, 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