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