我们可以简单地使用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 类,将属性name 和age 。之后,我们将创建不同的人的对象,并制作一个由这些对象组成的列表。当我们试图对列表进行排序时,程序将遇到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,