LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   Problem loading file of words in python (https://www.linuxquestions.org/questions/programming-9/problem-loading-file-of-words-in-python-346291/)

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

Crashed_Again 07-25-2005 07:40 PM

A dictionary object does not have an append method. You simply set a key equal to a value so instead of having this:

Code:

dictionary[sline].append(line)
you would have this:

Code:

dictionary[sline] = line
I didn't test all your code but I think thats the problem.

Also, in the sort_string function, you can replace a lot of that code with the built in list function:

Code:

word_list = list(word)


All times are GMT -5. The time now is 08:33 PM.