Forgive the amateur question: when would one absolutely need to have a function defined inline?
users = [["user1", 500], ["n00b", 15], ["thebestuser", 177]]
I want to sort the users according to number of posts. The sorted() function takes a parameter key=, you can do it this way without lambda: def get_users_by_posts():
def get_post_count(user):
return user[1]
return sorted(users, key=get_post_count)
The lambda implementation is a one-liner: def get_users_by_posts():
return sorted(users, key=lambda u : u[1])
Well, technically a twoliner, unless you use lambda more aggressively than most people: get_users_by_posts = lambda : sorted(users, key=lambda u : u[1])
In general, you can always expand your lambda's into def's, but it can make your code longer and pollute the code with named functions that do trivial things. import operator
def get_users_by_posts():
return sorted(users, key=operator.itemgetter(1))
then, if you really want to, you can use functools.partial to fill the parameters from functools import partial
from operator import itemgetter
get_users_by_posts = partial(sorted, users, key=itemgetter(1))A better way to do it is to take your core data structure, in this case a user, and turn it into a class, dictionary or named tuple. Classes are the best way - there are all sorts of ways to put a nice interface on them.
For example:
class User(object):
def __init__(self, name, post_count):
self.name = name
self.post_count = post_count
def __repr__(self):
return '<User name="%s", post_count="%s">' % (self.name, self.post_count)
def __cmp__(self, other_user):
# larger is better
return -cmp(self.post_count, other_user.post_count)
# set up data
users_ = [["user1", 500], ["n00b", 15], ["thebestuser", 177]]
users = []
for user in users_:
users.append(User(*user))
print users
# sort users by post count by default
print sorted(users)