字典树 python实现

Posted 幻觉czw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典树 python实现相关的知识,希望对你有一定的参考价值。

# -*- encoding:utf8 -*-
class Trie(object):

	def __init__(self):
		self.root = dict()

	def findnode(self, string):
		current_dict = self.root
		temp = None
		idx = 0
		while idx < len(string):
			temp = string[idx]
			if temp in current_dict.keys():
				current_dict = current_dict[temp]
				idx = idx + 1
			else:
				break
		return idx, current_dict

	def insert(self, string):
		idx, current_dict = self.findnode(string)
		length = len(string)
		if idx == length:
			return
		else:
			while idx < length:
				current_dict[string[idx]] = dict()
				current_dict = current_dict[string[idx]]
				idx = idx + 1

	def search(self, string):
		"""
		如果一个单词是另一个单词的一部分,比如in和inn,如果inn被添加,而in并没有被添加,在查找
		in时也能被查到
		"""
		idx, current_dict = self.findnode(string)
		length = len(string)
		if idx == length:
			return True
		else:
			return False

	def _printvalue(self, node, lists, string):
		items = sorted(node.items(), key = lambda x:x[0])
		for item in items:
			if not item[1]:
				string.append(item[0])
				lists.append(''.join(string))
				string.pop()
			else:
				string.append(item[0])
				self._printvalue(item[1], lists, string)
				string.pop()

	def show(self, node):
		"""
		以字典序的顺序输出所有的词条
		"""
		lists = []
		string = []
		self._printvalue(node, lists, string)
		return '\\n'.join(lists)

 	def delete(self, string):
 		"""
 		删除词条,尽量不影响其他的词条
 		"""
		idx, current_dict = self.findnode(string)
		length = len(string)
		if idx == length and current_dict:
			# 考虑到删除的词条可能是另一词条的一部分,为了不影响另一个词条,这个词条不会被删除
			return
		elif idx == length and not current_dict:
			i = 0
			idx = idx - 1
			dicts = self.root
			while i < idx:
				dicts = dicts[string[i]]
				i = i + 1
			dicts.pop(string[idx])
		else:
			raise Exception("%s is not exist" % string)

	def __str__(self):
		return self.show(self.root)

if __name__ == '__main__':
	t = Trie()
	t.insert('to')
	t.insert('tea')
	t.insert('ted')
	t.insert('ten')
	t.insert('a')
	t.insert('in')
	t.insert('inn')
	print t
	print t.root
	print t.search('in')
	print t.search('ted')
	print t.search('teas')
	print '======'
	t.delete('inn')
	t.delete('tea')
	t.delete('to')
	t.insert('to')
	print t

以上是关于字典树 python实现的主要内容,如果未能解决你的问题,请参考以下文章

支持中文的基于词为基本粒度的前缀树(prefix trie)python实现

搜索树

字典树原理与实现

字典树原理与实现

ID3决策树算法实现(Python版)

字典树与01字典树