【问题标题】:Lambda function in sorting/grouping排序/分组中的 Lambda 函数
【发布时间】:2017-03-10 23:45:40
【问题描述】:

我试图了解 lambda 在 groupby 或 sort 函数中的工作原理,例如,我有一个对象列表,每个对象都有两个属性:姓名和姓氏 我想按姓名和姓氏分组,我尝试了两次:

list.sort(key=lambda x: x.name and x.surname)
list.sort(key=lambda x: (x.name, x.surname))

然后分组

groupby(list, lambda x: x.name and x.surname)
groupby(list, lambda x: (x.name,x.surname))

我注意到排序和分组的第一个例子不能很好地工作,在这种情况下 lambda 是如何工作的?有没有什么好的方法来测试 lambda 函数在做什么?

谢谢!

【问题讨论】:

  • x.name and x.surname 是一个布尔表达式,您希望它如何反映排序的偏序?
  • 因为x and y(x, y)相同,而是x if not x else y
  • @MichaelFoukarakis 是的,这似乎很明显。我仍然不明白为什么当 lambda 是一个元组时它会起作用,我想我会更多地搜索 groupby 和 sort 如何处理参数。谢谢!
  • 返回元组时它似乎起作用的原因是元组按从左到右的顺序对其元素进行排序。

标签: python python-2.7 lambda


【解决方案1】:

让我们看看lambda x: x.name and x.surname 为给定对象返回什么:

class People(object):
    def __init__(self, name, surname):
        self.name = name
        self.surname = surname

name_and_surname = lambda p: p.name and p.surname

然后:

print(name_and_surname(People("Bill", "Gates"))) # will print "Gates"
print(name_and_surname(People("Name", "Surname"))) # will print "Surname"

这是因为 lambda 内的表达式 x.name and x.surname 的求值是它会通过 and “拆分”表达式,然后逐个评估每个表达式,返回第一个 falsy 值或最后一个表达式value不管是什么,以name_and_surname(People("Name", "Surname"))为例

  1. 评估 x.name 并获取值 "Name",这是一个 truthy 值,跳过它
  2. 评估x.surname并返回它,即"Surname"

所以当你使用lambda x: x.name and x.surname作为你的关键函数时,实际上你使用的是lambda x: x.surname

【讨论】:

  • 完美!,回答了 lambda 函数的工作原理,非常感谢!
【解决方案2】:

key 参数需要一个可调用对象,该可调用对象接收可迭代(列表)中的项目作为其第一个参数。可调用对象应返回一个对象;这个对象将用于对输出进行排序。

sorted([1,2,3,4,5])
[1, 2, 3, 4, 5]

sorted([1,2,3,4,5], key=lambda x: x * -1)
[5, 4, 3, 2, 1]

这同样适用于list.sort()

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多