系统分为两部分,第一部分是初始化综合数据库,分为两类,一类是间接数据库,即不指向最终动物的信息。另一类是直接数据库,即指向最终动物的信息。使用的是二维列表加上一个一维列表存储key与value。第二部分为添加数据库和识别动物,查询的时候添加,可以有效的扩增数据库,使功能更灵活与完善。在识别动物的时候,先在间接数据库中完善信息,在直接数据库中查找对应的动物,记录信息时,使用字典记录某个特征是否出现,这样查询的复杂度就为O(1)。(这一段为老师所给提示)
1、我选择构建直接、间接数据库的方式为将条件存入列表中,列表中的元素都有对应的下标,将下标作为字典的值、结果作为字典的键构成数据库,这样条件和结果就能构成一一对应的关系。因此程序中的数据库是包括列表、字典两部分的。
eg: 间接库列表:奶 哺乳动物+蹄 羽毛
间接库字典:哺乳动物->0 蹄类动物->1 鸟->2
2、识别动物的时候,先在间接库中进行推理,再在直接库中推理。
Indirdict=dict()#间接库字典,用于从数字寻找对应结果
Dirdict=dict()#直接库字典,用于从数字寻找对应结果
Indirlist=[]#间接库列表,用于存放动物特征的集合和定义、存放这个集合对应数字
Dirlist=[]#直接库列表,用于存放动物特征的集合和定义、存放这个集合对应数字
Indirnum=0#作为间接库字典的值
Dirnum=0#作为直接库字典的值
def change(str):#以字符串的形式输入全部特征值,这个函数可以将字符串中的特征值识
#别出来,并且将所有特征值存放到一个集合中
set1=set()#定义一个集合,存放特征值
str1=""
for i in range(0,len(str)):
if(str[i]!=" "):
str1+=str[i]
else:
set1.add(str1)
str1=""
i+=1
return set1
list1=[]#定义一个临时列表,表示间接库或直接库
dict1=dict()#定义一个临时字典,表示间接库字典或直接库字典
num1=0
def Builddata(list1,dict1,num1):#num1存放在字典中,与结果相对应
str2=input("请输入条件,以空格隔开:")#定义一个字符串,存放用户输入特征值
str2+=" "
while(str2!="0 "):
str3=input("请输入结果:")#字符串,存放结果
dict1[num1]=str3#将值与结果在字典中相对应
set2=change(str2)#集合,将用户输入特征值放入此集合内
list1.append(set2)#将特征值集合存入列表
str2=input("请输入条件,以空格隔开:")
str2+=" "
num1+=1
return num1
def Infer(animalset,list1,dict1):#推理函数,将动物条件的集合放在间接库或直接库中进行匹配
for i in range(0,len(animalset)):#保证循环足够多的次数
for j in range(0,(len(list1))):
if(list1[j].issubset(animalset) or list1[j]==animalset):
animalset.add(dict1[j])
#print(list1[j])
animalset=animalset-list1[j]
return animalset
def Rec():#识别动物
feature=input("请输入动物的特征(不同特征之间用空格隔开):")
feature+=" "
animalset=change(feature)
#将动物的特征化为关键词的集合
animalset=Infer(animalset,Indirlist,Indirdict)
set3=Infer(animalset,Dirlist,Dirdict)#返回经过直接规则库过滤后的集合
list2=list(set3)#将动物特征集合化为列表,便于确定最后剩下多少特征值
if(len(list2)==1):
print("这个动物是:"+list2[0])
else:
print("查无此动物")
print("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):")
chose = input()
while (chose!='0'):
if (chose=='1'):
print("构造间接数据库:(输入条件时输入0结束构建)")
Indirnum=Builddata(Indirlist,Indirdict,Indirnum)
print("间接数据库构造完成!")
print("")
chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):")
elif (chose=='2'):
print("构造直接数据库:(输入条件时输入0结束构建)")
Dirnum=Builddata(Dirlist,Dirdict,Dirnum)
print("直接数据库构造完成!")
print("")
chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):")
elif (chose=='3'):
Rec()
print("")
chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):")
else:
print("输入不合法,请重新输入")
chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):")
注:输入条件、结果时,构建间接规则库、构建直接规则库、查询动物时输入形式、相同的内容必须保持一致。
此文是借鉴大佬博客https://blog.csdn.net/weixin_46178977/article/details/105842471,是对大佬代码的拙劣优化。。
能够搞懂并改写这样的一个不很简单的程序,也算是对大一身为python小小白的我一个交代了吧。。