Problem loading a file of words

teoryn teoryn at gmail.com
Mon Jul 25 05:44:08 CEST 2005


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




More information about the Python-list mailing list