Python - игра в слова "Ghost", файловый ввод / вывод и вопрос списка - PullRequest
1 голос
/ 22 января 2011

Я хочу создать компьютер для игры в слова Призрак .Тем не менее, у меня возникают проблемы с поиском хорошего способа доступа к огромному списку слов.Вот моя текущая реализация (которая не работает):

import os, random, sys, math, string


def main():

    #Contains a huge wordlist-- opened up for reading
    dictionary = open("wordlist.txt", "r")
    wordlist = []
    win= 0
    turn= 0
    firstrun = 0
    word = ""

    #while nobody has won the game
    while win==0:
        if turn == 0:
            #get first letter from input
            foo = raw_input("Choose a letter: ")[0]
            word+=foo
            print "**Current word**: "+ word
            #Computer's turn
            turn = 1
        if turn == 1:
            #During the first run the program gets all definitively 
            #winning words (words that have odd-number lengths)
            #from the "dictionary" file and puts them in a list
            if firstrun== 0:
                for line in dictionary:
                    #if the line in the dictionary starts with the current 
                    #word and has an odd-number of letters                                                                                                
                    if str(line).startswith(word) and len(line)%2 == 0:
                        wordlist.append(line[0: len(line)-1])
                print "first run complete... size = "+str(len(wordlist))
                firstrun = 1
            else:   #This is run after the second computer move         
                for line in wordlist:
                    #THIS DOES NOT WORK-- THIS IS THE PROBLEM.
                    #I want it to remove from the list every single
                    #word that does not conform to the current limitations
                    #of the "word" variable. 
                    if not line.startswith(word): 
                        wordlist.remove(line)
                print "removal complete... size = "+str(len(wordlist))

            turn = 0




if __name__ == "__main__":
    main()

Я выделил проблемную область в коде.Я понятия не имею, почему это не работает.Что должно произойти: представьте, что список заполнен всеми словами, начинающимися с «а».Затем пользователь выбирает букву «б».Тогда целевое слово должно иметь начальные буквы «ab».Что должно произойти, так это то, что все слова «а», которые находятся в списке, за которыми непосредственно не следует буква «б», должны быть удалены.

Я также был бы признателен, если бы кто-нибудь дал мне знать более эффективный способ сделать это, чем составить огромный начальный список.

Ответы [ 3 ]

2 голосов
/ 22 января 2011

Я бы предложил не удалять слова из вашего списка. Это будет очень медленно, потому что удаление в середине списка - O (N).

Лучше просто составить новый список. Один из возможных способов сделать это - заменить строки

for line in wordlist:
    if not line.startswith(word):
        wordlist.remove(line)

с

wordlist = [w for w in wordlist if w.startswith(word)]
1 голос
/ 22 января 2011

У Питера Норвига есть отличное обсуждение автозамены здесь:

http://norvig.com/spell-correct.html

Понимание большого списка и сопоставление контекста кажутся актуальными - и в 21 строке это быстрое чтение (с хорошимобъяснение следующее).Также ознакомьтесь с 3-й частью "Очаровательного питона" по функциональному программированию с использованием python (IBM).Вы можете выполнить всю настройку с помощью нескольких списков.

0 голосов
/ 23 января 2011

Если вы хотите работать в ITA, вам лучше написать это в кратком изложении ... или clojure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...