2010-09-20 2 views
0

Проблема:

У меня есть trie, и я хочу, чтобы вернуть информацию, хранящуюся в нем. Некоторые листья имеют информацию (задано как значение> 0), а некоторые листья - нет. Я хотел бы вернуть только те листья, которые имеют ценность.Как использовать генератор перебрать листья на дереве в

Как и во всех количествах листьев на каждом узле, переменная, а ключ к каждому значению фактически состоит из пути, необходимого для достижения каждого листа.

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

Мой модуль:

class Node(): 
    '''Each leaf in the trie is a Node() class''' 
    def __init__(self): 
     self.children = {} 
     self.value = 0 

class Trie(): 
    '''The Trie() holds all nodes and can return a list of their values''' 
    def __init__(self): 
     self.root = Node() 
    def add(self, key, value): 
     '''Store a "value" in a position "key"''' 
     node = self.root 
     for digit in key: 
      number = digit 
      if number not in node.children: 
       node.children[number] = Node() 
      node = node.children[number] 
     node.value = value 
    def __iter__(self): 
     return self.postorder(self.root) 
    def postorder(self, node): 
     if node: 
      for child in node.children.values(): 
       self.postorder(child) 
      # Do my printing/job related stuff here 
      if node.value > 0: 
       yield node.value 

Пример использования:

>>trie = Trie() 
>>trie.add('foo', 3) 
>>trie.add('foobar', 5) 
>>trie.add('fobaz', 23) 

>>for key in trie: 
>>....print key 
>> 
3 
5 
23 

Я знаю, что пример, приведенный просто и может быть решена с помощью какой-либо другой структуры данных. Однако для этой программы важно использовать trie, так как это очень полезно для шаблонов доступа к данным.

Спасибо за помощь!

Примечание: в блоке кода я пропустил новые строки, чтобы с большей легкостью копировать-вставлять.

+0

Кстати, вы можете сменить листья на листья –

+0

@Tim Mcnamara. Единственным генератором в поле зрения является генератор _function_, а не генератор _expression_. – aaronasterling

+0

Спасибо за очистку, что @Aaron, моя ошибка. –

ответ

2

Изменить

self.postorder(child) 

в

for n in self.postorder(child): 
    yield n 

, кажется, делает его работу.

P.S. Очень полезно, чтобы вы оставили пустые строки для удобства вырезания & paste :)

+0

+1. Может быть, добавить рекурсию для повторения более глубоких потомков? –

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