on line 94 you have

                yield node.items()


this will yield node.items() which is itself a generator.... this is not
what you want to do.

If it was Python 3, you could do:

                yield from node.items()

and that would be correct.

Since it's Python 2, you have to do

    for i in node.items():
        yield i

This will make the recursion work and iterate over the whole list.

--Mark


On Fri, Aug 30, 2013 at 10:04 PM, Maria McKinley <[email protected]>wrote:

> I'll assume as long as people are answering me, there is enough interest
> to keep going...
>
> I was having a problem seeing the representation of my object, but I did
> figure that out. I was able to print from the items method, and see that
> the code wasn't yielding the correct variable in order see the letter
> itself.
>
> Each time you add a word to the trie, it adds each letter of that word to
> a node. I have two words (that start with different letters) in my trie, so
> when I do the loop, I see the two letters at the top node.
>
> Weirdly, if I stick in letter.next() in the loop:
>
> for letters in mytrie.items():
>     print 'letters', letters
>     letters.next()
>
> I do get the 2nd layer, but no more. If I try to do more, I get
> StopIteration. My biggest problem is I can't decide if the problem is my
> lack of understanding of generators or if this code is just not written
> correctly. Surely, it is suppose to be iterating through the entire tree,
> and not just the root level? How do I drill down to lower levels? I see how
> it is done for adding new words, but can't make something similar work for
> looking at unknown words.
>
> I have my code up here:
>
> https://github.com/codedragon/trie
>
> but it isn't a whole lot different from what is in the wikipedia article.
> Just has a script for playing around with it and some print statements
> stuck in.
>
> thanks again,
> Maria
>
>
>
>
>
>
> On Thu, Aug 29, 2013 at 9:49 PM, Joseph Wright <[email protected]>wrote:
>
>> No, it wouldn't help with the iteration, but I thought you were having a
>> problem seeing the representation of your object. Now I'm trying to figure
>> this thing out….
>>
>> It looks like the reason the 'char' only showing the first letter is
>> because in the add() method, the first letter of the string is what it
>> assigns to head:
>>
>>          head, tail = s[0], s[1:]
>>
>> So it uses just one letter at a time per node.
>>
>> Joseph
>>
>>
>> On Aug 29, 2013, at 8:55 PM, Maria McKinley <[email protected]>
>> wrote:
>>
>> Not yet, would that solve the problem that it is not iterating? Using
>> some good old-fashioned print statements, I found out a little bit more.
>>
>> I added the following print statements:
>>
>>         for char, node in self.root.iteritems():
>>             # node.value is none when not at end of word
>>
>>             if node.value is None:
>>                 print 'none'
>>                 print 'char',char
>>                 print 'node',node
>>                 yield node.items()
>>             else:
>>                 print 'stuff'
>>                 yield node
>>
>> And this was the output. There are 2 words in the trie, but it only
>> reports the first letter of each word, and stops:
>>
>> none
>> char p
>> node <trie.Trie instance at 0x10e8d0560>
>> <generator object items at 0x10e8bc690>
>> none
>> char t
>> node <trie.Trie instance at 0x10e8bab48>
>> <generator object items at 0x10e8bc5a0>
>>
>> ~maria
>>
>>
>> On Thu, Aug 29, 2013 at 7:59 PM, Joseph Wright <[email protected]>wrote:
>>
>>> Have you tried defining __repr__?
>>>
>>> Joseph
>>>
>>> On Aug 29, 2013, at 7:56 PM, Maria McKinley <[email protected]>
>>> wrote:
>>>
>>> Thanks Morris. That does answer one question, I can't assume code on
>>> wikipedia is bug-free. Changing it doesn't solve the problem,
>>> unfortunately, but you are right, time to hit the debugger. Thanks everyone.
>>>
>>> cheers,
>>> Maria
>>>
>>>
>>> On Thu, Aug 29, 2013 at 5:46 PM, Morris Bernstein <
>>> [email protected]> wrote:
>>>
>>>> I hate to suggest this because I almost never use it, but have you
>>>> considered using the pdb debugger and setting a breakpoint?
>>>>
>>>> Meanwhile, your problem is here:
>>>> def items(self):
>>>>         """Return an iterator over the items of the `Trie`."""
>>>>         for char, node in self.root.iteritems():
>>>>             if node.value is None:
>>>>                 yield node.items
>>>>
>>>> node.items is the the Trie.items() method bound to the node object.
>>>>
>>>> I think, taking a quick look at the code, you want to yield
>>>> node.items(), function call again.  Looks like the same problem.
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Thu, Aug 29, 2013 at 5:17 PM, Maria McKinley <
>>>> [email protected]> wrote:
>>>>
>>>>> Doh. Thanks. This does the trick, but it gives me the instance
>>>>> location. I assumed this is because there is no __str__ method defined, 
>>>>> but
>>>>> when I added a __str__ method it didn't change anything. Probably didn't
>>>>> implement the __str__ method correctly, but since I didn't even get an
>>>>> error, not sure this was even the problem. (Pretty sure, for example, that
>>>>> I shouldn't always be referencing the head node.)
>>>>>
>>>>> def __str__(self):
>>>>>     return "Node letter is %s" % (self.root[0])
>>>>>
>>>>> for c in mytrie.items():
>>>>>     print c
>>>>>    ...:
>>>>> <bound method Trie.items of <trie.Trie instance at 0x1010dc710>>
>>>>> <bound method Trie.items of <trie.Trie instance at 0x1010dca70>>
>>>>>
>>>>> thanks again,
>>>>> Maria
>>>>>
>>>>>
>>>>> On Thu, Aug 29, 2013 at 4:40 PM, Cris Ewing <[email protected]>wrote:
>>>>>
>>>>>> I expect that the problem here is that you are attempting to iterate
>>>>>> over the method itself, rather than its result.  You'd need to call the
>>>>>> method to do that:
>>>>>>
>>>>>>   for c in mytrie.items():
>>>>>>       print c
>>>>>>
>>>>>> hth
>>>>>>
>>>>>> c
>>>>>>
>>>>>> On Aug 29, 2013, at 4:38 PM, Maria McKinley wrote:
>>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> I hope someone on this list doesn't mind answering what I think is a
>>>>>> quick question. I have been playing around with the python code found 
>>>>>> here:
>>>>>>
>>>>>> http://en.wikipedia.org/wiki/Trie#A_Python_version
>>>>>>
>>>>>> I can't get the iterator to work, and I wonder if I'm not calling it
>>>>>> correctly. I thought once I made my object, and added stuff to it, I 
>>>>>> could
>>>>>> just do this:
>>>>>>
>>>>>> for c in mytrie.items:
>>>>>>     print c
>>>>>>
>>>>>> but I get this error:
>>>>>>
>>>>>> TypeError: 'instancemethod' object is not iterable
>>>>>>
>>>>>> What am I doing wrong?
>>>>>>
>>>>>> thanks,
>>>>>> Maria
>>>>>>
>>>>>>
>>>>>>  Cris Ewing
>>>>>> --------------------------------------------------
>>>>>> Principal, Cris Ewing, Developer LLC
>>>>>> http://www.crisewing.com
>>>>>> [email protected]
>>>>>> 1.206.724.2112
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Maria Mckinley
>>>>> Software Developer with Bonus SysAdmin Experience
>>>>> www.mariakathryn.net
>>>>> www.linkedin.com/in/mariamckinley
>>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> Maria Mckinley
>>> Software Developer with Bonus SysAdmin Experience
>>> www.mariakathryn.net
>>> www.linkedin.com/in/mariamckinley
>>>
>>>
>>>
>>
>>
>> --
>> Maria Mckinley
>> Software Developer with Bonus SysAdmin Experience
>> www.mariakathryn.net
>> www.linkedin.com/in/mariamckinley
>>
>>
>>
>
>
> --
> Maria Mckinley
> Software Developer with Bonus SysAdmin Experience
> www.mariakathryn.net
> www.linkedin.com/in/mariamckinley
>

Reply via email to