我试图创建一个简单的单词游戏,我需要检查玩家写入的单词是否在字典中。
现在,我能够逐行检查,但它不是很有效所以我希望有更好的方法
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)
答案 0 :(得分: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"
但是我觉得这样做太过分了:将字典读入内存会很快。
答案 1 :(得分:0)
如果您的csv文件是静态文件(除了主脚本之外没有任何进程正在更新它),那么您实际上是在寻找set of words
(您可以使用set - 我会使用dict给出一个示例)我不记得,但我认为比使用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)