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