Using methodcaller in a list sort - any examples anywhere?

Peter Otten __peter__ at web.de
Tue Dec 13 11:13:50 EST 2011


tinnews at isbd.co.uk wrote:

> I want to sort a list of 'things' (they're fairly complex objects) by
> the contents of one of the fields I can extract from the 'things'
> using a Python function.
> 
> So I have a list L which is a list of objects of some sort.  I can
> output the contents of a field in the list as follows:-
> 
>     for k in L:
>         print k.get_property('family-name')
> 
> How can I sort the list first?  As I said it seems like a methodcaller
> is the answer but I don't see how.  I want to sort the list of objects
> not just produce a sorted list of names.

The most obvious way is to use a custom function

def get_family_name(obj):
    return obj.get_property("family-name")
L.sort(key=get_family_name)

However, since you already know about methodcaller

""" 
class methodcaller(builtins.object)
 |  methodcaller(name, ...) --> methodcaller object
 |
 |  Return a callable object that calls the given method on its operand.
 |  After, f = methodcaller('name'), the call f(r) returns r.name().
 |  After, g = methodcaller('name', 'date', foo=1), the call g(r) returns
 |  r.name('date', foo=1).
""""

L.sort(key=methodcaller("get_property", "family-name"))




More information about the Python-list mailing list