lists and list item matches (ghost wodgame)

Baba raoulbia at gmail.com
Thu Sep 23 00:39:54 CEST 2010


On Sep 22, 9:18 pm, Baba <raoul... at gmail.com> wrote:
> On Sep 22, 3:38 pm, nn <prueba... at latinmail.com> wrote:
>
>
>
> > On Sep 21, 6:39 pm, Baba <raoul... at gmail.com> wrote:
>
> > > Hi
>
> > > query level: beginner
>
> > > as part of a learning exercise i have written code that:
>
> > > a) asks for a single letter input (assumption: only 1 letter wil be
> > > entered)
> > > b) adds that letter to list1 and then goes through list2 and checks:
>
> > >     1) if any item in list2 starts with list1 > if False: break
> > >     2) if list1 == any item in list2 > if True: break
>
> > > c) start again until 2) is True
>
> > > wordlist = ['hello', 'bye']
> > > handlist = []
> > > letter = raw_input('enter letter: ')
> > > handlist.append(letter)
> > > hand = "".join(handlist)
> > > for item in wordlist:
> > >     if item.startswith(hand):
> > >         while item.startswith(hand):
> > >             if hand not in wordlist:
> > >                 letter = raw_input('enter letter: ')
> > >                 handlist.append(letter)
> > >                 hand = "".join(handlist)
> > >             else: break
> > >         else: break
> > > print 'you loose'
>
> > > this code works but can it be optimised? i have the feeling that my
> > > nesting of IF, WHILE and FOR statements is overkill?
>
> > > inspired by part IV ofhttp://ocw.mit.edu/courses/electrical-engineering-and-computer-scienc...
>
> > > thanks
> > > Baba
>
> > Yes it is overkill. Especially the else:break from the while loop
> > makes it difficult to follow the logic. Also the program breaks down
> > if I use the following word list:
>
> > wordlist = ['hello', 'hamburger', 'bye']
>
> > enter letter: h
> > enter letter: a
> > you loose
>
> > I am not going to post any spoilers but I wrote your program using one
> > while loop and one generator expression for a total of 5 lines. My
> > version might be a bit too advanced but you should still be able to do
> > it using only one while, one for and one if instead.
>
> Hi nn,
>
> i wasn't expecting my code to fail with an additional word in it.
> While i was conscious that the whole construct was heavy i thought the
> reasoning worked. I keep looking at it but can't figure out the
> problem Can you give me a hint?
>
> In the meantime i found out that it is actually possible to populate a
> string (just like a list, a dictionary or a tuple). Here's what i've
> got now:
>
> wordlist = ['hello', 'bye']
> hand = ''
> for item in wordlist:
>     if item.startswith(hand):
>         while item.startswith(hand):
>             if hand not in wordlist:
>                 hand += raw_input('enter letter: ')
>                 print hand
>             else: break
>         else: break
> print 'you loose'
>
> But i can't figure out why it won't work when adding the extra word.
> Thanks by the way, it taught me not to be too confident when things
> SEEM to work...
>
> Why does it work when i use the built-in function any(iterable)?? To
> me using the any(iterable) function seems just like regrouping 3 lines
> into one...
>
> wordlist = ['hello','hamburger', 'bye', 'cello']
> hand = ''
> while any(item.startswith(hand) for item in wordlist):
>     if hand not in wordlist:
>         hand += raw_input('enter letter: ')
>     else: break
> print 'you loose'
>
> thanks
>
> Baba

Hi nn,

looking at my original code again i realise that having a raw_input
inside a FOR loop is flawed per se (at least for my purposes) so i
will just assume that i was taking the wrong approach initially. No
point in analysing it further. Thanks for your help.

Baba



More information about the Python-list mailing list