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

Reply via email to