鱼C论坛

 找回密码
 立即注册
查看: 3047|回复: 4

[技术交流] Python小练习(008):字典树基础篇(查找关键字)

[复制链接]
发表于 2016-11-17 14:59:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jerryxjr1220 于 2016-11-17 15:05 编辑

昨天介绍了字典树的创建,传送门
今天继续学习用字典树查找关键词。

其实,查找关键词相对还是比较简单的。原理就是按关键词的每个字母依次到字典树中查找,如果有就进下一级,没有就中止搜索,返回'未找到'。若每个字母都找到了,那么在最后返回'找到'。再进入下一个查找循环。

请利用上一个小练习的题目,继续编写搜索函数。

评分

参与人数 1荣誉 +5 收起 理由
JAY饭 + 5

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-17 16:01:14 | 显示全部楼层
学习了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-18 08:06:06 | 显示全部楼层
解答
  1. def findtree(lst,tree):
  2.     for word in lst:
  3.         node = tree
  4.         for w in word:
  5.             node = node.get(w,None)
  6.             if node == None:
  7.                 print word + ' not found!'
  8.                 break
  9.         try:
  10.             node=node.get('/',0)
  11.             if node == None:
  12.                 print word + ' found!'
  13.             else:
  14.                 print word + ' not found!'
  15.         except:
  16.             pass
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-18 08:15:01 | 显示全部楼层
其实,为了方便使用,我们可以把字典树的创建和查找做成一个类。这样调用的时候就非常方便了。
完整代码如下:
  1. #coding=utf-8  
  2. class Trie:  
  3.     root = {}  
  4.     END = '/'  
  5.     def add(self, word):  
  6.         #从根节点遍历单词,char by char,如果不存在则新增,最后加上一个单词结束标志  
  7.         node = self.root  
  8.         for c in word:  
  9.             node=node.setdefault(c,{})  
  10.         node[self.END] = None
  11.                
  12.     def find(self, word):  
  13.         node = self.root  
  14.         for c in word:  
  15.             if c not in node:  
  16.                 return False  
  17.             node = node[c]  
  18.         return self.END in node
复制代码

调用创建字典树:
  1. tree = Trie()
  2. List = ["A", "to", "tea", "ted", "ten", "i", "in", "inn"]
  3. for s in List:
  4.         tree.add(s)
  5. print tree.root
复制代码

在字典树中查找:
  1. print tree.find('ted')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-18 08:18:00 | 显示全部楼层
更新完毕。
在下一次的《字典树提高篇》中会给大家分享如何应用字典树做到“输入单词的前缀马上能显示完整的单词”,其实IDLE的提示功能就是运用的类似原理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-6 09:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表