如何将对象属性作为函数参数传递给lambda函数?

2024-09-28 22:02:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了两个返回排序列表的函数。它们都以包含Employee类实例的列表作为参数。第一个按名称属性排序,第二个按年龄排序,它们都使用lambda函数

class Employee():

    allEmployees = []

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Employee.allEmployees.append(self)


def sortEmployeesByName(some_list, name):
    return sorted(some_list, key=lambda employee: employee.name)

def sortEmployeesByAge(some_list, age):
    return sorted(some_list, key=lambda employee: employee.age)

如何才能只创建一个函数sortEmployees,其中我将属性作为第二个参数传递,同时还使用lambda函数?在

例如

^{pr2}$

Tags: lambda函数nameself列表agereturn属性
3条回答

使用operator.attrgeter。我添加了__repr__方法来查看示例:

from operator import attrgetter

class Employee:

    allEmployees = []

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Employee.allEmployees.append(self)

    def __repr__(self):
        return f'Employee({self.name}, {self.age})'

def sortEmployees(some_list, attribute):
    f = attrgetter(attribute)
    return sorted(some_list, key=f)

l = [Employee('John', 30),
Employee('Miranda', 20),
Employee('Paolo', 42)]

print(sortEmployees(Employee.allEmployees, 'name'))
print(sortEmployees(Employee.allEmployees, 'age'))

印刷品:

^{pr2}$

这是另一个使用^{}的版本。我认为在这里给Employee类a.sortclassmethod是有意义的。我从andrejkesely“借用”了__repr__方法和测试数据。;)

from operator import attrgetter

class Employee:
    allEmployees = []

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Employee.allEmployees.append(self)

    def __repr__(self):
        return f'Employee({self.name}, {self.age})'

    @classmethod
    def sort(cls, attr):
        return sorted(cls.allEmployees, key=attrgetter(attr))   

Employee('John', 30)
Employee('Miranda', 20)
Employee('Paolo', 42)

print(Employee.sort('name'))
print(Employee.sort('age'))

输出

^{pr2}$

operator.attrgetter的一个优点是我们可以向它传递多个属性,它将返回一个属性元组。我们可以使用它在一个过程中按多个属性排序。但是我们需要稍微修改.sort方法。其他代码保持不变。在

    @classmethod
    def sort(cls, *attrs):
        return sorted(cls.allEmployees, key=attrgetter(*attrs))


Employee('John', 30)
Employee('Miranda', 20)
Employee('Paolo', 42)
Employee('John', 20)

print(Employee.sort('name'))
print(Employee.sort('age'))
print(Employee.sort('name', 'age'))

输出

[Employee(John, 30), Employee(John, 20), Employee(Miranda, 20), Employee(Paolo, 42)]
[Employee(Miranda, 20), Employee(John, 20), Employee(John, 30), Employee(Paolo, 42)]
[Employee(John, 20), Employee(John, 30), Employee(Miranda, 20), Employee(Paolo, 42)]

你想要operator.attrgetter,不需要lambdas。这也应该表现得更好:

sorted(some_list, key=operator.attrgetter('name'))

相关问题 更多 >