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