[Tutor] sorting objects on two attributes

Andreas Kostyrka andreas at kostyrka.org
Mon Mar 3 15:42:43 CET 2008


Well, this assumes that all named attributes do exist. If not, you need
to replace x.attr with getattr(x, "attr", defaultvalue) ;)


l.sort(key=lambda x: (x.content_type, x.submit_date))

Now, you can construct a sorted list "t":

t = []
for key, item_iterator in itertools.groupby(l, key=lambda x: (x.content_type, x.submit_date)):
    sorted_part = sorted(item_iterator, key=lambda x: x.submit_date)
    t.append((sorted_part[-1].submit_date, key, sorted_part))

t.sort()

t = sum([x[2] for x in t], [])

Totally untested, as written in the MTA :)

Andreas


Am Montag, den 03.03.2008, 22:19 +0800 schrieb Eric Abrahamsen:
> I have a grisly little sorting problem to which I've hacked together a  
> solution, but I'm hoping someone here might have a better suggestion.
> 
> I have a list of objects, each of which has two attributes, object_id  
> and submit_date. What I want is to sort them by content_type, then by  
> submit_date within content_type, and then sort each content_type block  
> according to which block has the newest object by submit_date. (This  
> sequence of sorting might not be optimal, I'm not sure). I'm actually  
> creating a list of recent comments on blog entries for a python-based  
> web framework, and want to arrange the comments according to blog  
> entry (content_type), by submit_date within that entry, with the  
> entries with the newest comments showing up on top.
> 
> I don't believe a single cmp function fed to list.sort() can do this,  
> because you can't know how two objects should be compared until you  
> know all the values for all the objects. I'd be happy to be proven  
> wrong here.
> 
> After some false starts with dictionaries, here's what I've got.  
> Queryset is the original list of comments (I'm doing this in django),  
> and it returns a list of lists, though I might flatten it afterwards.  
> It works, but it's ghastly unreadable and if there were a more  
> graceful solution I'd feel better about life in general:
> 
> 
> def make_com_list(queryset):
>     ids = set([com.object_id for com in queryset])
>     xlist = [[com for com in queryset if com.object_id == i] for i in  
> ids]
>     for ls in xlist:
>         ls.sort(key=lambda x: x.submit_date)
>     xlist.sort(key=lambda x: max([com.submit_date for com in x]),  
> reverse=True)
>     return xlist
> 
> I'd appreciate any hints!
> 
> Thanks,
> Eric
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Dies ist ein digital signierter Nachrichtenteil
Url : http://mail.python.org/pipermail/tutor/attachments/20080303/7ca5901e/attachment.pgp 


More information about the Tutor mailing list