Teoryn |
07-24-2005 02:29 PM |
Problem loading file of words in python
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:
Code:
#!/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
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)
Code:
Enter a scrambled word : ccehimnostyz
Traceback (most recent call last):
File "unscram.py", line 62, in ?
results = dictionary[sort_string(lookup)]
KeyError: 'ccehimnostyz'
If you'd like a copy of the dictionary I'm using email me at teoryn@gmail.com or leave your email here and I'll send it to you (It's 702.2 KB compressed)
Thanks,
Kevin
|