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
An idiomatic Python 2.4 version of this function would be: def sort_string(word): word = word.lower() sorted_list = sorted(word) sorted_word = ''.join(sorted_list) 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() # this really should all be within a function, but let's just carry on dictionary = {} f = open('dictionary.txt') try: # enclose this in a try: finally: block in case something goes wrong for line in f: line = line.strip().lower() sline = sort_string(line) val = dictionary.setdefault(sline, []) val.append(line) print "Added %s to key %s" % (line, sline) finally: 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) Well, my version works (using /usr/share/dict/words from Debian as dictionary.txt). Yours does, too. Are you sure that you are using the right dictionary.txt? -- Robert Kern [EMAIL PROTECTED] "In the fields of hell where the grass grows high Are the graves of dreams allowed to die." -- Richard Harter -- http://mail.python.org/mailman/listinfo/python-list