Problem loading a file of words

Robert Kern rkern at ucsd.edu
Mon Jul 25 00:18:02 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

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
rkern at ucsd.edu

"In the fields of hell where the grass grows high
  Are the graves of dreams allowed to die."
   -- Richard Harter




More information about the Python-list mailing list