我将详细说明 Ignacio Vazquez-Abrams 的回答。 cmp 已弃用。不要使用它。请改用key 属性。
lambda 做一个函数。它是一个表达式,因此可以到达普通 def 语句不能到达的地方,但它的主体仅限于单个表达式。
my_func = lambda x: x + 1
这定义了一个函数,它接受一个参数 x 并返回 x + 1。 lambda x, y=1: x + y 定义了一个函数,它接受一个 x 参数、一个默认值为 1 的可选 y 参数并返回 x + y。如您所见,它实际上就像一个def 语句,只是它是一个表达式,并且仅限于一个用于正文的表达式。
key 属性的用途是 sorted 将为要排序的序列的每个元素调用它,并使用它返回的值进行比较。
list_ = ['a', 'b', 'c']
sorted(list_, key=lambda x: 1)
请阅读其余部分以获取假设示例。在写这篇文章之前,我没有仔细研究问题。虽然它仍然具有教育意义,所以我会留下它。
我们真的不能说更多,因为
- 您无法对
dicts 进行排序。你有dictss 的列表吗?我们可以对其进行排序。
- 您尚未显示
username 密钥。
我会假设它类似于
users = [{'name': 'Tom Cruise', 'username': user234234234, 'reputation': 1},
{'name': 'Aaron Sterling', 'username': 'aaronasterling', 'reputation': 11725}]
如果你想确认我比汤姆克鲁斯更厉害,你可以这样做:
sorted(users, key=lambda x: x['reputation'])
这只是传递一个函数,该函数返回列表中每个字典的'reputation' 值。但是lambdas 可能会慢一些。大多数时候operator.itemgetter 是你想要的。
operator.itemgetter 接受一系列键并返回一个函数,该函数接受一个对象并返回其参数值的元组。
所以f = operator.itemgetter('name', 'username') 将返回与
lambda d: (d['name'], d['username']) 不同之处在于,原则上它应该运行得更快,而且你不必看丑陋的lambda 表达式。
所以要按名称和用户名对dicts 列表进行排序,只需这样做
sorted(list_of_dicts, operator.itemgetter('name', 'username'))
这正是 Ignacio Vazquez-Abrams 所建议的。