Я пробираюсь через книгу NLTK Берда, Кляйна и Лопера, и я застрял в проблеме. Я работаю над книгой для своего личного обогащения, а не для класса.
Проблема, на которой я застрял, - 4.29:
Написать рекурсивныйфункция, которая довольно печатает дерево в алфавитном порядке, например:
chair: 'flesh'
---t: 'cat'
--ic: 'stylish'
---en: 'dog'
Я использую этот код из книги для создания дерева:
def insert(trie, key, value):
if key:
first, rest = key[0], key[1:]
if first not in trie:
trie[first] = {}
insert(trie[first], rest, value)
else:
trie['value'] = value
trie = {}
insert(trie, 'chat', 'cat')
insert(trie, 'chien', 'dog')
insert(trie, 'chair', 'flesh')
insert(trie, 'chic', 'stylish')
Я изменил ответ из этого обсуждения для функции, которая рекурсивно проходит через три и извлекает полные ключи и значения:
def trawl_trie(trie):
unsorted = []
for key, value in trie.items():
if 'value' not in key:
for item in trawl_trie(trie[key]):
unsorted.append(key + item)
else:
unsorted.append(': ' + value)
return unsorted
Но я 'Я не могу использовать рекурсию, чтобы составить алфавитный список, и при этом я не могу понять, как использовать рекурсию, чтобы заменить дублирующиеся части ключей. Лучшее, что я могу сделать, - это создать вспомогательную функцию, которая обрабатывает результаты описанной выше функции:
def print_trie(trie):
# sort list alphabetically
alphabetized = list(sorted(set(trawl_trie(trie))))
print(alphabetized[0])
# compare the 2nd item ~ to the previous one in the list.
for k in range(1, len(alphabetized)):
# separate words from value
prev_w, prev_d = (re.findall(r'(\w+):', alphabetized[k - 1]), re.findall(r': (\w+)', alphabetized[k - 1]))
curr_w, curr_d = (re.findall(r'(\w+):', alphabetized[k]), re.findall(r': (\w+)', alphabetized[k]))
word = ''
# find parts that match and replace them with dashes
for i in range(min(len(prev_w[0]), len(curr_w[0]))):
if prev_w[0][i] == curr_w[0][i]:
word += prev_w[0][i]
curr_w[0] = re.sub(word, '-' * len(word), curr_w[0])
print(curr_w[0] + ": " + str(curr_d[0]))
Это будет вывод:
print_trie(trie)
chair: flesh
---t: cat
--ic: stylish
---en: dog
Кто-нибудь знает, еслиможно было бы получить тот же результат с одной рекурсивной функцией? Или я застрял, используя рекурсивную функцию, чтобы пройти три, и вторую вспомогательную функцию, чтобы все выглядело хорошо?
Приветствия,