Second python program: classes, sorting
B
execrable at gmail.com
Sun Aug 10 15:17:09 EDT 2008
WP wrote:
> 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. I've
> determined that __cmp__ is called but it's only called twice for three
> list elements, isn't that odd?
>
> Complete program:
> class Score:
> def __init__(self, name_, score_):
> self.name = name_
> self.score = score_
>
> def __str__(self):
> return "Name = %s, score = %d" % (self.name, self.score)
>
> def __cmp__(self, other):
> print "in __cmp__"
> return self.score >= other.score
>
> name = ""
> score = 0
> # 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)
>
> lines = infile.readlines()
>
> 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.sort()
>
> for a_score in scores:
> print a_score
>
> Test file contents:
> Michael 11
> Hanna 1337
> Lena 99
>
> Output:
> in __cmp__
> in __cmp__
> Name = Michael, score = 11
> Name = Hanna, score = 1337
> Name = Lena, score = 99
>
> What am I doing wrong here?
>
> - Eric (WP)
From http://docs.python.org/ref/customization.html:
__cmp__( self, other)
Called by comparison operations if rich comparison (see above) is
not defined. Should return a negative integer if self < other, zero if
self == other, a positive integer if self > other.
You're not handling all the comparison cases, just assumping __cmp__ is
being called for >=, when it's not.
You can fix your __cmp__ function, but it's probably easier to
understand if you overload specific comparison functions: __lt__,
__gt__, etc.
More information about the Python-list
mailing list