2015-05-17 3 views
-1

я смотрел на этот код:реализация Python Trie зачем создавать временную переменную

>>> _end = '_end_' 
>>> 
>>> def make_trie(*words): 
...  root = dict() 
...  for word in words: 
...   current_dict = root 
...   for letter in word: 
...    current_dict = current_dict.setdefault(letter, {}) 
...   current_dict = current_dict.setdefault(_end, _end) 
...  return root 
... 
>>> make_trie('foo', 'bar', 'baz', 'barz') 
{'b': {'a': {'r': {'_end_': '_end_', 'z': {'_end_': '_end_'}}, 
     'z': {'_end_': '_end_'}}}, 
'f': {'o': {'o': {'_end_': '_end_'}}}} 

по этой ссылке: How to create a TRIE in Python, но я не совсем понимаю, почему автор создает временную переменную current_dict, так как вы всегда просто редактирования словаря под названием корень ...

+0

Я удалил свою совершенно неправильную мысль о том, как работает код, извините! Я все еще думаю, что этот вопрос принадлежит codereview.stackexchange.com. – GreenAsJade

+0

Должен ли я задавать вопросы о реализации там в будущем? если да, то почему? –

+0

StackOverflow предназначен для конкретных вопросов о конкретной проблеме с кодом (более подробную информацию читайте [help]). CodeReview предназначен для запроса информации о том, как код может быть улучшен, и о том, как сделать что-то определенным образом. – GreenAsJade

ответ

2

Я не совсем понимаю, почему автор создает временную переменную current_dict, так как вы всегда только редактирование словаря под названием корень ...

Нет, это не так. Если бы он всегда редактировал корень словаря, результат был бы совсем другим. Каждый раз, когда задание внутри цикла выполняются:

...   current_dict = root 
...   for letter in word: 
...    current_dict = current_dict.setdefault(letter, {}) # this one 

current_dict установлен в словарь один уровень далее в этом цикле пересекает синтаксическое дерево, используя setdefault построить недостающие части по мере необходимости.. Мы должны присвоить setdefault результат current_dict, чтобы продолжать движение вниз, вместо того, чтобы оставаться на верхнем уровне, и мы должны использовать отдельную переменную current_dict вместо root, чтобы мы могли назначить current_dict = root, чтобы вернуться на верхний уровень, как только мы закончим со словом.

+0

Почему это, что 'current_dict' установлен на словарь на один уровень дальше? Я не понимаю, как это произошло. –

+0

@KevinZhao: Вы знаете, что возвращает 'setdefault'? – user2357112

+0

Согласно TutorialsPoint (http://www.tutorialspoint.com/python/dictionary_setdefault.htm), «Этот метод возвращает значение ключа, доступное в словаре, и если данный ключ недоступен, он вернет предоставленное значение по умолчанию». поэтому в основном текущий_dict будет равен новому словарю после первого раза, а затем, когда я снова запустил строку setdefault, я устанавливаю ключ нового словаря и значения, который является одним уровнем в, это правильно? –

Смежные вопросы