0

我试图创建一个简单的文字游戏,我需要检查玩家写的单词是否在字典中。

目前,我可以逐行检查它,但它不是很有效,所以我希望有更好的方法

import csv

word = raw_input('write your word')

def dict_test(word):
    with open('/home/patryk/Pulpit/slownik.csv', 'r') as dictionary:
        reader = csv.reader(dictionary, delimiter = ' ')

        for row in reader:

             if word not in row:
                print word + ' it doesnt exist in dictionary'
             elif word in row:
                print word + ' ### OK ### '
dict_test(word)
4

2 回答 2

0

如果可以将 csv 文件读入列表中,并且列表的每个元素中都有一个单词,则可以使用"word" in dictionary_list. 我的列表是按字母顺序排列的,然后可以通过二分搜索来完成更快的搜索。bisect 模块使用二进制搜索,并包含索引函数的配方:

from bisect import bisect_left
def index(a, x):
'Locate the leftmost value exactly equal to x'
i = bisect_left(a, x)
if i != len(a) and a[i] == x:
    return i
raise ValueError

然后你可以使用这个

try:
    i = index(dictionary_list,word):
    print word + "== Ok =="
except ValueError:
    print word, "doesn't exist in dictionary"

但我认为这是矫枉过正:将字典读入内存会足够快。

于 2013-08-30T00:30:31.343 回答
0

如果您的 csv 文件是静态文件(除了您的主脚本之外没有其他进程正在更新它),那么您实际上是在寻找一个set of words(您可以使用 set - 我将举一个使用 dict 的示例(我不记得但我think 比使用 set 快))

您可以执行以下操作

import csv

word_dict = {}

def dict_test(word):
   if word_dict.get(word):
      print word + "### OK ###"
   else:
      print word + "is not in dictionary"

def load_words():
    with open('/home/patryk/Pulpit/slownik.csv', 'r') as dictionary:
        reader = csv.reader(dictionary, delimiter = ' ')

        for row in reader:
             words = row.split()
             for word in words:
                 word_dict[word] = 1

# Load all the contect of csv file ONCE
load_words() 
# Now continue asking user
word = raw_input('write your word')
dict_test(word)
于 2013-08-30T04:11:09.290 回答