在Python中对对象列表进行排序

172 阅读4分钟

我们可以简单地使用sort() 方法或sorted() 函数对一个数字列表进行排序。但是,对于使用自定义类创建的对象列表,我们不能这样做。在这篇文章中,我们将讨论如何在python中使用sort() 方法和sorted() 函数对一个对象列表进行排序。

表的内容

如何在Python中对一个对象列表进行排序?

通常情况下,当我们有一个数字列表时,我们可以使用sort() 方法进行排序,如下所示。

myList = [1, 2, 9, 3, 6, 17, 8, 12, 10]
print("Original list is:", myList)
myList.sort()
print("The sorted list is:", myList)

输出。

Original list is: [1, 2, 9, 3, 6, 17, 8, 12, 10]
The sorted list is: [1, 2, 3, 6, 8, 9, 10, 12, 17]

现在,让我们尝试对一个对象的列表进行排序。为此,我们将创建一个Person 类,将属性nameage 。之后,我们将创建不同的人的对象,并制作一个由这些对象组成的列表。当我们试图对列表进行排序时,程序将遇到TypeError异常,如下所示。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name


person1 = Person("Sam", 12)
person2 = Person("Harry", 23)
person3 = Person("Tom", 17)
person4 = Person("John", 30)
person5 = Person("Kite", 40)
person6 = Person("Emily", 23)

myList = [person1, person2, person3, person4, person5, person6]
print("Original list is:")
for person in myList:
    print(person, end=",")
print("\n")
myList.sort()
print("The sorted list is:", myList)

输出。

Original list is:
Sam,Harry,Tom,John,Kite,Emily,

/usr/lib/python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.7) or chardet (3.0.4) doesn't match a supported version!
  warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/string1.py", line 22, in <module>
    myList.sort()
TypeError: '<' not supported between instances of 'Person' and 'Person'

这里发生的错误是因为我们不能用<操作符来比较两个Person 对象。因此,我们必须指定一个Person 类的属性,用来比较两个不同的Person对象。为此,我们在sort() 方法中使用 "key" 参数。

我们将首先创建一个函数getAge() ,接受一个Person 对象作为输入参数,并返回age

之后,我们将把getAge() 函数分配给key 参数。执行后,sort()方法将对Person对象的列表进行排序,如下例所示。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name


def getAge(person):
    return person.age


person1 = Person("Sam", 12)
person2 = Person("Harry", 23)
person3 = Person("Tom", 17)
person4 = Person("John", 30)
person5 = Person("Kite", 40)
person6 = Person("Emily", 23)

myList = [person1, person2, person3, person4, person5, person6]
print("Original list is:")
for person in myList:
    print(person, end=",")
print("\n")
myList.sort(key=getAge)
print("The sorted list is:")
for person in myList:
    print(person, end=",")

输出。

Original list is:
Sam,Harry,Tom,John,Kite,Emily,

The sorted list is:
Sam,Tom,Harry,Emily,John,Kite,

如果你不允许修改输入列表,你可以使用sorted() 函数来对对象列表进行排序。这里,我们将把对象列表作为第一个输入参数,把getAge() 函数作为第二个输入参数。执行后,它将返回一个排序后的对象列表,如下所示。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name


def getAge(person):
    return person.age


person1 = Person("Sam", 12)
person2 = Person("Harry", 23)
person3 = Person("Tom", 17)
person4 = Person("John", 30)
person5 = Person("Kite", 40)
person6 = Person("Emily", 23)

myList = [person1, person2, person3, person4, person5, person6]
print("Original list is:")
for person in myList:
    print(person, end=",")
print("\n")
newList = sorted(myList, key=getAge)
print("The sorted list is:")
for person in newList:
    print(person, end=",")

输出。

Original list is:
Sam,Harry,Tom,John,Kite,Emily,

The sorted list is:
Sam,Tom,Harry,Emily,John,Kite,

使用Lambda函数对一个对象列表进行排序

我们可以使用lambda函数来对对象列表进行排序,而不是定义一个不同的函数,如getAge() 。在这里,我们将创建一个lambda函数,接收一个对象并返回其属性。然后,我们将把这个lambda函数分配给sort() 方法中的参数key。在执行sort() 方法后,列表将被排序,你可以在下面的例子中看到。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name


person1 = Person("Sam", 12)
person2 = Person("Harry", 23)
person3 = Person("Tom", 17)
person4 = Person("John", 30)
person5 = Person("Kite", 40)
person6 = Person("Emily", 23)

myList = [person1, person2, person3, person4, person5, person6]
print("Original list is:")
for person in myList:
    print(person, end=",")
print("\n")
myList.sort(key=lambda p: p.age)
print("The sorted list is:")
for person in myList:
    print(person, end=",")

输出。

Original list is:
Sam,Harry,Tom,John,Kite,Emily,

The sorted list is:
Sam,Tom,Harry,Emily,John,Kite,

你也可以不使用sort() 方法,而是使用sorted() 函数和lambda函数来对一个对象列表进行排序,如下例所示。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name


person1 = Person("Sam", 12)
person2 = Person("Harry", 23)
person3 = Person("Tom", 17)
person4 = Person("John", 30)
person5 = Person("Kite", 40)
person6 = Person("Emily", 23)

myList = [person1, person2, person3, person4, person5, person6]
print("Original list is:")
for person in myList:
    print(person, end=",")
print("\n")
newList = sorted(myList, key=lambda p: p.age)
print("The sorted list is:")
for person in newList:
    print(person, end=",")

输出。

Original list is:
Sam,Harry,Tom,John,Kite,Emily,

The sorted list is:
Sam,Tom,Harry,Emily,John,Kite,