lists and list item matches (ghost wodgame)

Baba raoulbia at gmail.com
Wed Sep 22 22:18:18 CEST 2010


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




More information about the Python-list mailing list