On Sep 23, 10:56 am, nn <prueba...@latinmail.com> wrote: > On Sep 22, 6:39 pm, Baba <raoul...@gmail.com> wrote: > > > > > On Sep 22, 9:18 pm, Baba <raoul...@gmail.com> wrote: > > > > On Sep 22, 3:38 pm, nn <prueba...@latinmail.com> wrote: > > > > > On Sep 21, 6:39 pm, Baba <raoul...@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 > > Since you seem to have figured it out I will post my version (python > 3): > > wordlist = ['hello', 'hamburger', 'bye'] > inp='' > while any(word.startswith(inp) and word!=inp for word in wordlist): > inp += input('enter letter: ') > print('you lose') > > The reason why your original version didn't work was because each time > you add a letter you have to go again over all words (in reality only > a subset is required) and find a new one. Your version would find one > word using the first letter and then exit.
Actually my version isn't right (for some values of right): wordlist = ['hello', 'hamburger', 'bye'] inp='' while any(word.startswith(inp) for word in wordlist) and (inp not in wordlist): inp += input('enter letter: ') print('you lose') An explanation of how this changes the rules of the wordgame is left as an exercise to the reader. -- http://mail.python.org/mailman/listinfo/python-list