WP a écrit :
Hello, here are some new things I've problems with. I've made a program that opens and reads a text file. Each line in the file contains a name and a score. I'm assuming the file has the correct format. Each name-score pair is used to instantiate a class Score I've written. This works fine, but here's my problem: After reading the file I have list of Score objects. Now I want to sort them in descending order. But no matter how I write my __cmp__ the order remains unchanged.

You fixed this, so I'll just comment on the rest of the code...

(snip)


Complete program:
class Score:

Unless you have a compelling reason (mostly: compat with ages old Python versions), better to use new-style classes:

class Score(object):

    def __init__(self, name_, score_):
        self.name = name_
        self.score = score_

cf Eric Brunel's comments here about the trailing underscores.

    def __str__(self):
        return "Name = %s, score = %d" % (self.name, self.score)

(snip)

    name  = ""
    score = 0

Do you have any reason to have these as class attributes too ?


# End class Score

filename = "../foo.txt";

try:
    infile = open(filename, "r")
except IOError, (errno, strerror):
print "IOError caught when attempting to open file %s. errno = %d, strerror = %s" % (filename, errno, strerror)
    exit(1)

cf Eric Brunel's comment wrt/ why this try/except clause is worse than useless here.

lines = infile.readlines()

File objects are their own iterators. You don't need to read the whole file in memory.

infile.close()

lines = [l.strip() for l in lines] # Strip away trailing newlines.

scores = []

for a_line in lines:

    splitstuff = a_line.split()

    scores.append(Score(splitstuff[0], int(splitstuff[1])))


scores = []
mk_score = lambda name, score : Score(name, int(score))

infile = open(filename)
for line in infile:
    line = line.strip()
    if not line:
        continue
    scores.append(mk_score(*line.split()))

infile.close()


As a side note : I understand that this is a learning exercice, but in real life, if that's all there is to your Score class, it's not really useful - I'd personnally use a much simpler representation, like a list of score / name pairs (which is easy to sort, reverse, update, turn into a name=>scores or scores=>names dict, etc).

My 2 cents.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to