teoryn wrote: > I've been spending today learning python and as an exercise I've ported > a program I wrote in java that unscrambles a word. Before describing > the problem, here's the code: > > *--beginning of file--* > #!/usr/bin/python > # Filename: unscram.py > > def sort_string(word): > '''Returns word in lowercase sorted alphabetically''' > word = str.lower(word) > word_list = [] > for char in word: > word_list.append(char) > word_list.sort() > sorted_word = '' > for char in word_list: > sorted_word += char > return sorted_word > > print 'Building dictionary...', > > dictionary = { } > > # Notice that you need to have a file named 'dictionary.txt' > # in the same directory as this file. The format is to have > # one word per line, such as the following (of course without > # the # marks): > > #test > #hello > #quit > #night > #pear > #pare > > f = file('dictionary.txt') > > # This loop builds the dictionary, where the key is > # the string after calling sort_string(), and the value > # is the list of all 'regular' words (from the dictionary, > # not sorted) that passing to sort_string() returns the key > > while True: > line = f.readline() > if len(line) == 0: > break > line = str.lower(line[:-1]) # convert to lowercase just in case > and > # remove the return at the end of > the line > sline = sort_string(line) > if sline in dictionary: # this key already exist, add to > existing list > dictionary[sline].append(line) > print 'Added %s to key %s' % (line,sline) #for testing > else: # create new key and list > dictionary[sline] = [line] > print 'Created key %s for %s' % (sline,line) #for > testing > f.close() > > print 'Ready!' > > # This loop lets the user input a scrambled word, look for it in > # dictionary, and print all matching unscrambled words. > # If the user types 'quit' then the program ends. > while True: > lookup = raw_input('Enter a scrambled word : ') > > results = dictionary[sort_string(lookup)] > > for x in results: > print x, > > print > > if lookup == 'quit': > break > *--end of file--* > > > If you create dictionary.txt as suggested in the comments, it should > work fine (assumeing you pass a word that creates a valid key, I'll > have to add exceptions later). The problem is when using a large > dictionary.txt file (2.9 MB is the size of the dictionary I tested) it > always gives an error, specifically: > (Note: ccehimnostyz is for zymotechnics, which is in the large > dictionary) > > > *--beginning of example--* > Enter a scrambled word : ccehimnostyz > Traceback (most recent call last): > File "unscram.py", line 62, in ? > results = dictionary[sort_string(lookup)] > KeyError: 'ccehimnostyz' > *--end of example--* > > > If you'd like a copy of the dictionary I'm using email me at teoryn at > gmail dot com or leave your email here and I'll send it to you (It's > 702.2 KB compressed) > > Thanks, > Kevin
Heh, it reminds me of the code I used to write. def sort_string(word): return ''.join(sorted(list(word.lower()))) f = open('dictionary.txt','r') lines = [line.rstrip('\n') for line in f.readlines()] f.close() dictionary = dict((sort_string(line),line) for line in lines) lookup = '' while lookup != 'quit': lookup = raw_input('Enter a scrambled word:') if dictionary.has_key(lookup): word = dictionary[lookup] else: word = 'Not found.' print word You need python 2.4 to use this example. -- http://mail.python.org/mailman/listinfo/python-list