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