[Tutor] sorting objects in lists by 2 attr

Eric Brunson brunson at brunson.com
Tue Jul 24 02:52:19 CEST 2007


SQL databases are cool.  Make them do as much as they can for you.  :-)

Philippe Niquille wrote:
> Tanks a mill!
>
> I don't know why I searched so far..
>
> Anyway, I wrapped the django custom SQL call and built a nice 
> dictionary out of the resulting rows (which is similar to querysets). 
> See http://www.djangosnippets.org/snippets/207/ 
> <http://www.djangosnippets.org/snippets/207/> for details.
>
> Philippe
>
> Am 23.07.2007 um 19:28 schrieb Eric Brunson:
>> Philippe Niquille wrote:
>>>
>>>  
>>> Hi
>>>
>>>  
>>>
>>>  
>>> I have a hard time sorting an object list. Perhaps this is kind of a 
>>> noob question, but I would very much appreciate any help!
>>>
>>>  
>>>
>>>  
>>> Using django I get a QuerySet of Score objects which are sorted by 
>>> the actual score, the actual score divided by the max. possible 
>>> score (so sorting by two db fields).
>>>
>>>  
>>> I then need to loop through that queryset and sum up all the score 
>>> objects which belong to the same user into one Score objects. This 
>>> works (see code below).
>>>
>>>  
>>>
>>>  
>>> The problem I now have, is that I lost the sorting order, as 
>>> described above. How would I resort it with a python algortithm 
>>> instead of SQL?
>>>
>>>  
>>
>>  
>> This is not the question you're asking, but my first though was, why 
>> not have SQL do the summing for you using sum() and group by?
>>
>>  
>>>
>>>  
>>> scores = Score.objects.order_by('score', 'score2','owner') # filter 
>>> by course, MC !!
>>>
>>>  
>>> # loop through scores to regroup by user
>>>
>>>  
>>> newscore = []
>>>
>>>  
>>> for s in scores:
>>>
>>>  
>>> i = False
>>>
>>>  
>>> # loop through new object container and check for existant user 
>>> index, add scores if existant
>>>
>>>  
>>> for ns in newscore:
>>>
>>>  
>>> if s.owner == ns.owner:
>>>
>>>  
>>> ns.score = int(ns.score) + int(s.score)
>>>
>>>  
>>> ns.maxscore = int(ns.maxscore) + int(s.maxscore )
>>>
>>>  
>>> i = True
>>>
>>>  
>>> # otherwise append new user index object, work with it later, 
>>> perhaps (if more user objects exist)
>>>
>>>  
>>> if i == False:
>>>
>>>  
>>> newscore.append(s)
>>>
>>>  
>>>
>>>  
>>> -----------------
>>>
>>>  
>>>
>>>  
>>> I did fiddle around with .sort() but didn't get any useful results 
>>> (and it would only sort by one object..).
>>>
>>>  
>>>
>>>  
>>> class CmpAttr:
>>>
>>>  
>>> def __init__(self, attr):
>>>
>>>  
>>> self.attr = attr
>>>
>>>  
>>> def __call__(self, x, y):
>>>
>>>  
>>> return cmp(getattr(x, self.attr), getattr(y, self.attr))
>>>
>>>  
>>>
>>>  
>>> newscore.sort(CmpAttr("score"))
>>>
>>>  
>>>
>>>  
>>>
>>>  
>>> ps. could it be, that this maillist is blocking some e-mail addresses?
>>>
>>>  
>>> ------------------------------------------------------------------------
>>>
>>>  
>>> _______________________________________________
>>> Tutor maillist  -   Tutor at python.org <mailto:Tutor at python.org>
>>> http://mail.python.org/mailman/listinfo/tutor
>>>   
>>
>>  
>
>



More information about the Tutor mailing list