Sorting x lists based on one list ... maybe an example would make sense:

Ron Adam rrr at ronadam.com
Wed May 18 15:35:24 EDT 2005


Philippe C. Martin wrote:
>>Another way would be to merge the three lists into one of 3-tuples, sort,
>>and unmerge, similarly to the DSU pattern -- which raises the question:
>>why are you using three lists in the first place?
> 
> 
> :-) Thanks, the lists will evolve and are also stored in 'csv' format in
> external files at one point. I cannot use dictionaries because I need to
> control the sorting (hash).
> 
> In this specific case, list 1 represents students with their information,
> list 2 represents assignments with information such as weight, term, max
> grade ... and list 3 the actual grades.
> 
> Regards,
> 
> Philippe

Hi Philippe,

As Peter suggested this sounds like a database.  Especially if it will 
evolve and grow to the point where it will not all fit in memory.  Also 
data bases already have a lot of ability to query, and generate sorted 
reports built into them.

This is a fairly normal task for a relational data base where you have a 
transaction list, (grades), that are connected to other lists, 
(students, and assignments).  This saves a lot of space by not 
duplicating the student information and assignment information for each 
grade given.  It also makes updating student information easier because 
it only needs to be updated once, and not changed everwhere it's referenced.

If your lists are not going to grow larger than what will fit in memory, 
you can use dictionaries and lists.  Loosely like the following...

- Read student info from cvs file into dictionary using student_id or 
number as a key. Names can be used if they are unique.  The content of 
each student file will be a list, with None for missing items.

     students[student_id] = (name, address, phone, etc....)

- Read assignments into dictionary using an assignment_no as key.

     assignments[assignment_no] = (a_name, description, etc...)

- Create a grades list which will contain grade tuples:
	
     [(date,student_id,assignment_no,grade), ... more grades ... ]


You can sort your grades list however you want. If you want to sort by 
student name instead of student_id, you would use:

     # Sort grades list by student name.
     grades.sort(lambda x,y: cmp(students[x[1]][0], students[y[1]][0]))

Assuming the name is in the first field in the student dictionary-value 
tuple.  There are probably other ways to do this that are more readable 
or faster.

The grade list could also be filtered, so if you want to get all the 
grades for a specific student, or all the grades for a particular 
assignment you can just loop through grades list and print what you want.

An alternative query would be to get all the students who have not 
completed an assignment:  Get a list of all the student who have a grade 
for the assignment, then use that to get a list from the student 
dictionary, who are not in the students_completed_assignment list.

Anyway, just trying to give you some ideas.

Cheers,
_Ron



More information about the Python-list mailing list