[Tutor] Sorting a list of objects on different fields

Kent Johnson kent37 at tds.net
Thu Mar 2 22:25:50 CET 2006


Terry Carroll wrote:
> I have a list (or a list-like object, doesn't matter) of objects, each of
> which has multiple fields.  I want to be able to arbitrarily sort the list
> on any of them, or at least on several of them.
> 
> To make this a little more concrete, here's a simplified idea.  Say the 
> objects each represent a file, and I've got fields in it 
> like this:
> 
>  self.filesz: size of the file
>  self.filename: name of the file
>  self.users : a list of people who need to know if the file gets updated
>  self.filetype : a short description of the file contents
> 
>  etc.
> 
> 
> I sometimes want to sort the list by filesz; and sometimes by filename; 
> and maybe sometimes by some other field.
> 
> My sense right now is that the "list" of these objects itself should be an 
> object inheriting from list, and that I should create a small sort method 
> for each field I intend to sort on.  (I don't have the book handy, but 
> there's a nice recipe for this in the Python Cookbook, 2d Edition, for 
> such a method.)

As long as your list-like object is list-like enough to be sorted, you 
can use operator.attrgetter to create functions that serve as a key 
parameter.

In [1]: class foo(object):
    ...:     def __init__(self, a, b, c):
    ...:         self.a = a; self.b = b; self.c = c
    ...:     def __repr__(self):
    ...:         return repr((self.a, self.b, self.c))
    ...:
    ...:

In [2]: lst = [foo(1, 'one', 'I'), foo(2, 'two', 'II'), foo(10, 'ten', 
'X'), foo(50, 'fifty', 'V')]

In [7]: lst
Out[7]: [(1, 'one', 'I'), (2, 'two', 'II'), (10, 'ten', 'X'), (50, 
'fifty', 'V')]

In [8]: from operator import attrgetter

In [9]: lst.sort(key=attrgetter('b')); print lst
[(50, 'fifty', 'V'), (1, 'one', 'I'), (10, 'ten', 'X'), (2, 'two', 'II')]

In [10]: lst.sort(key=attrgetter('c')); print lst
[(1, 'one', 'I'), (2, 'two', 'II'), (50, 'fifty', 'V'), (10, 'ten', 'X')]

Kent



More information about the Tutor mailing list