3 ms·
It's not a matter of absolute need; it's a matter of shortening functions. For example, say I have a list of username and number of posts: users = [["user1"
by csense 14y ago
It's not a matter of absolute need; it's a matter of shortening functions. For example, say I have a list of username and number of posts:
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.
- _ZeD_ 14y agowell, in this particular case, operator.itemgetter is your friend :D 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))
- anthonyb 14y agoNo, don't do this. The people maintaining your code will hate you if everything is an unnamed lambda. 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)