Jun 19, 2016

Sort array of objects using Comparator in python

Problem:- Given an array of  Student objects, sort array using a comparator that sorts them in order of decreasing marks; if  or more students have the same marks, sort those students alphabetically by name.
Input :- Array of Student objects(Student object { Name; Marks;})
amy 90
ckm 90
nikhil 50
shweta 75
ranjan 150

Output
:- Sort based on Marks (Name alphabetically if  marks is same)
ranjan  150
amy    90
ckm   90
shweta  75
nikhil    50

Sample program to sort list of student objects by passing comparator

class Students:
    def __init__(self, name, marks):
        self.name = name
        self.marks = marks 
    def comparator(a, b):
        if a.marks != b.marks :
            if a.marks < b.marks :
                return 1
            elif a.marks > b.marks:
                return -1
            else :
                return 0
        else:
            if a.name > b.name :
                return 1
            elif a.name < b.name:
                return -1
            else :
                return 0

print "Enter number of students "
n = int(raw_input())

data = []
for i in range(n):
    print "Enter Name and marks of student %d" %(i+1)
    name, marks = raw_input().split()
    marks = int(marks)
    player = Students(name, marks)
    data.append(player)
    
data = sorted(data, cmp=Students.comparator)
print "\nStudents Name and marks in sorted form "
print "Name \t Marks"
print "----------------"
for i in data:
    print i.name+ " \t "+ str(i.marks)

Sample output:-
>>>
Enter number of students
5
Enter Name and marks of student 1
amy 90
Enter Name and marks of student 2
ckm 90
Enter Name and marks of student 3
nikhil 50
Enter Name and marks of student 4
shweta 75
Enter Name and marks of student 5
ranjan 150

Students Name and marks in sorted form
Name Marks
----------------
ranjan 150
amy 90
ckm 90
shweta 75
nikhil 50
Location: Hyderabad, Telangana, India