Wow, okay, so that is a lot of recursion and generation for me to wrap my
brain around.

I was trying to understand what was going on, and I put the code in a
visualizer, which you can see here:

*http://tinyurl.com/orzrlh2*

So, now I can almost wrap my brain around it.


On Fri, Aug 30, 2013 at 11:18 PM, Maria McKinley <mar...@mariakathryn.net>wrote:

> Yay! Thanks. Still working out exactly how to make it work how I want, but
> I feel like I'm getting the idea of how this is working now...  I will post
> code when I have it working properly.
>
> ~maria
>
>
> On Fri, Aug 30, 2013 at 10:42 PM, Mark Harviston <mark.harvis...@gmail.com
> > wrote:
>
>> 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 <mar...@mariakathryn.net
>> > 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 <jos...@mammalia.net>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 <mar...@mariakathryn.net>
>>>> 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 <jos...@mammalia.net>wrote:
>>>>
>>>>> Have you tried defining __repr__?
>>>>>
>>>>> Joseph
>>>>>
>>>>> On Aug 29, 2013, at 7:56 PM, Maria McKinley <mar...@mariakathryn.net>
>>>>> 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 <
>>>>> mor...@systems-deployment.com> 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 <
>>>>>> mar...@mariakathryn.net> 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 <c...@crisewing.com>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
>>>>>>>> c...@crisewing.com
>>>>>>>> 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
>>>
>>
>>
>
>
> --
> 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