Неправильный вывод при реализации словаря T9 в Python
Я пытаюсь реализовать T9
словарь в python
, я использую Trie
реализовать это. У меня есть этот код, который создает Trie
из слов в словаре, а затем сделать поиск шаблона
import string
PHONE_LETTERS = 'abcdefghijklmnopqrstuvwxyz'
PHONE_NUMBERS = '22233344455566677778889999'
PHONE_TRANS = string.maketrans(PHONE_LETTERS, PHONE_NUMBERS)
class Node:
def __init__(self, key):
self.children = {}
self.key = key
self.values = []
def append_word(node, sequence, completeword):
if not sequence:
return
key = sequence[0]
try:
child = node.children[key]
except KeyError:
child = Node(key)
node.children[key] = child
if len(sequence) == 1:
child.values.append(completeword)
else:
append_word(child, sequence[1:], completeword)
def lookup(node, sequence=None):
if sequence:
# there are still numbers in the sequence: follow them in the trie
try:
child = node.children[sequence[0]]
return lookup(child, sequence[1:])
except KeyError:
return []
else:
# the sequence is empty: explore the trie using a DFS
result = node.values[:]
for child in node.children.values():
result.extend(lookup(child))
return result
def main():
root = Node(None)
words = ['hello','hess','home','abhi','busy','disturb']
for wlist in words:
print wlist
map(lambda l: append_word(root, l.strip().translate(PHONE_TRANS), l.strip()), wlist)
words = sorted(lookup(root, '43'))
print "Words: %s" % words
if __name__ == '__main__':
main()
Теперь, когда я запускаю это, я должен получить [hello,hess]
как вывод правильно? Но я получаю пустой список. Какую ошибку я здесь делаю?
1 ответ
Решение
Когда ты map
ваш append
функция вы действительно хотите отобразить его на протяжении всего wlist
строка?
Если вы позвоните translate
на wlist
Строка вместо каждой отдельной буквы вы получаете:
hello
hess
home
abhi
busy
disturb
Words: ['hello', 'hess']
Все, что вам нужно сделать, это удалить map
вызов:
import string
PHONE_LETTERS = 'abcdefghijklmnopqrstuvwxyz'
PHONE_NUMBERS = '22233344455566677778889999'
PHONE_TRANS = string.maketrans(PHONE_LETTERS, PHONE_NUMBERS)
class Node:
def __init__(self, key):
self.children = {}
self.key = key
self.values = []
def append_word(node, sequence, completeword):
if not sequence:
return
key = sequence[0]
try:
child = node.children[key]
except KeyError:
child = Node(key)
node.children[key] = child
if len(sequence) == 1:
child.values.append(completeword)
else:
append_word(child, sequence[1:], completeword)
def lookup(node, sequence=None):
if sequence:
# there are still numbers in the sequence: follow them in the trie
try:
child = node.children[sequence[0]]
return lookup(child, sequence[1:])
except KeyError:
return []
else:
# the sequence is empty: explore the trie using a DFS
result = node.values[:]
for child in node.children.values():
result.extend(lookup(child))
return result
def main():
root = Node(None)
words = ['hello','hess','home','abhi','busy','disturb']
for wlist in words:
print wlist
# XXX here, you shouldn't be mapping the `translate` call onto the entire string
append_word(root, wlist.strip().translate(PHONE_TRANS), wlist)
words = sorted(lookup(root, '43'))
print "Words: %s" % words
if __name__ == '__main__':
main()