夜光序言:
能够让人从癫狂中沉静,从暴戾中平和的力量,就是所谓的爱情吧~~
正文:
4.7 实践项目:我的英文字典
4.7.1 项目目标
实现一个简单的英语字典查询与管理程序。一个英文单词包含单词与单词的注释,结构如下:
words=[{"word":"about","note":"在附近,关于"},{"word":"post","note":"邮寄、投递"}]
所有的单词组成一个列表,每个单词与注释成为一个字典,程序的功能就是管理这样一组单词记录,程序有查找单词、增加单词、更新注释、删除单词、显示单词等功能。
程序运行的效果如下:
1.显示 2.查找 3.增加 4.更新 5.删除 6.退出
请选择(1,2,3,4,5):1
about : 在附近,关于
post : 邮寄、投递
4.7.2 项目设计
1、单词存储
数据使用全局变量 words=[]存储,它是一个列表,每个元素是一个字典,字典是单词与注释的信息。
2、单词查找
为了加快查找的速度,我们把单词按字典顺序从小到大排列,查找时采用二分法查找~~~
二分法查找是一种高效的查找方法,在 words 中查找单词 w,主要思想如下:
(1) 设置 i=0,j=len(words)-1,即 i、j 是第一与最后一个下标;
(2) 如果 i<=j 就计算 m=(i+j)//2,m 是中间一个下标,如果 i>j 程序结束;
(3) 如果 words[m]["word"]==w["word"],那么说明 words[m]就是要找的单词,m 就是这个单词在列表中的位置;
(4) 如果 words[m]["word"]>w["word"],说明 word[m]这个单词比要找的单词大,由于是从小到大排序的,因此设置 j=m-1,构造[i,m-1]范围回到(2 继续)查找;
(5) 如果 words[m]["word"]<w["word"],说明 word[m]这个单词比要找的单词小,由于是从小到大排序的,因此设置 i=m+1,构造[m+1,j]范围回到(2 继续)查找;
(6) 如果全部查找完毕没有找到单词,那么这个单词是新的单词,它应该放在 words[i]的位置。
查找函数 seek 如下:
def seek(word):
i=0
j=len(words)-1
while i<=j:
m=(i+j)//2
if words[m]["word"] == word:
print("%-16s : %s" % (word, words[m]["note"]))
return
elif words[m]["word"]>word:
j=m-1
else:
i=m+1
print(word + " --- 查找失败")
3、插入单词
这是根据二分法查找思想设计的插入函数,把新的单词插入到 words[i]的位置:
def insert(w):
global words
i=0
j=len(words)-1
while i<=j:
m=(i+j)//2
if words[m]["word"] == w["word"]:
print(w["word"]+" --- 已经存在")
return
elif words[m]["word"]>w["word"]:
j=m-1
else:
i=m+1
words.insert(i,w)
print(w["word"] + " --- 增加成功")
在单词更新与删除中也采用二分法查找单词,
4.7.3 项目实践
words=[{"word":"about","note":"在附近,关于"},{"word":"post","note":"邮寄、投递"}]
def show():
for w in words:
print("%-16s : %s" % (w["word"],w["note"]))
print()
def enter():
w={}
w["word"]=input("单词:")
w["note"]=input("注释:")
return w
def seek(word):
i=0
j=len(words)-1
while i<=j:
m=(i+j)//2
if words[m]["word"] == word:
print("%-16s : %s" % (word, words[m]["note"]))
return
elif words[m]["word"]>word:
j=m-1
else:
i=m+1
print(word + " --- 查找失败")
def insert(w):
global words
i=0
j=len(words)-1
while i<=j:
m=(i+j)//2
if words[m]["word"] == w["word"]:
print(w["word"]+" --- 已经存在")
return
elif words[m]["word"]>w["word"]:
j=m-1
else:
i=m+1
words.insert(i,w)
print(w["word"] + " --- 增加成功")
def update(w):
global words
i=0
j=len(words)-1
while i<=j:
m=(i+j)//2
if words[m]["word"] == w["word"]:
words["note"]=w["note"]
print(w["word"]+" --- 更新成功")
return
elif words[m]["word"]>w["word"]:
j=m-1
else:
i=m+1
print(w["word"] + " --- 查找失败")
def delete(word):
global words
i=0
j=len(words)-1
while i<=j:
m=(i+j)//2
if words[m]["word"] == word:
del words[m]
print(word+" --- 删除成功")
return
elif words[m]["word"]>word:
j=m-1
else:
i=m+1
print(word + " --- 查找失败")
while True:
print("1.显示 2.查找 3.增加 4.更新 5.删除 6.退出")
s=input("请选择(1,2,3,4,5):")
if s=="1":
show()
elif s == "2":
word = input("单词:")
seek(word)
elif s=="3":
w=enter()
insert(w)
elif s=="4":
w=enter()
update(w)
elif s=="5":
word=input("单词:")
delete(word)
elif s=="6":
break
print("Finished")
夜光:主程序部分是一个无限循环,只有选择 6 后才退出并结束,选择 1、2、3、4、5 分别执行显示、查找、增加、更新、删除的操作。