Problem loading a file of words

Devan L devlai at gmail.com
Mon Jul 25 00:14:33 EDT 2005


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.




More information about the Python-list mailing list