Python 对列表排序
在 Python 中,列表(List)是一种常用的数据结构,用于存储一组有序的元素。当我们需要对列表中的元素进行排序时,可以利用 Python 提供的排序方法来实现。
本文将详细介绍 Python 中对列表排序的方法,包括对数字、字符串和自定义对象进行排序。我们将逐步介绍如何使用内置的 sort
和 sorted
函数,以及如何通过自定义排序函数来实现灵活的排序操作。
排序数字列表
首先,我们来看一下如何对数字列表进行排序。假设我们有一个包含多个数字的列表:
nums = [7, 2, 5, 1, 9]
我们可以使用 sort
方法对该列表进行原地排序,即修改原始列表:
nums.sort()
print(nums) # 输出:[1, 2, 5, 7, 9]
我们也可以使用 sorted
函数对列表进行排序,该函数会返回一个新的排序后的列表,而不会修改原始列表:
nums_sorted = sorted(nums)
print(nums_sorted) # 输出:[1, 2, 5, 7, 9]
print(nums) # 输出:[7, 2, 5, 1, 9]
sort
和 sorted
方法默认按照元素的大小进行升序排序。如果要进行降序排序,可以通过设置 reverse=True
参数来实现:
nums.sort(reverse=True)
print(nums) # 输出:[9, 7, 5, 2, 1]
nums_sorted_desc = sorted(nums, reverse=True)
print(nums_sorted_desc) # 输出:[9, 7, 5, 2, 1]
以上就是对数字列表进行排序的基本用法。
排序字符串列表
除了对数字列表进行排序,我们也可以对字符串列表进行排序。假设我们有一个包含多个字符串的列表:
words = ['apple', 'banana', 'orange', 'pear']
同样地,我们可以使用 sort
方法对该列表进行原地排序,或者使用 sorted
函数返回一个新的排序后的列表:
words.sort()
print(words) # 输出:['apple', 'banana', 'orange', 'pear']
words_sorted = sorted(words)
print(words_sorted) # 输出:['apple', 'banana', 'orange', 'pear']
与数字列表不同的是,对字符串列表进行排序时,Python 会按照字符串的字典顺序进行排序。这意味着大写字母会排在小写字母之前,而在相同字母大小写之间,将根据字母在字母表中的顺序进行排序。
如果要按照字符串的长度进行排序,可以通过设置 key
参数为 len
函数来实现:
words.sort(key=len)
print(words) # 输出:['pear', 'apple', 'banana', 'orange']
words_sorted_len = sorted(words, key=len)
print(words_sorted_len) # 输出:['pear', 'apple', 'banana', 'orange']
我们可以看到,上述代码将字符串列表按照字符串的长度进行了排序。
排序自定义对象列表
除了数字和字符串列表,我们还可以对自定义对象列表进行排序。在 Python 中,对象的排序依赖于对象的比较运算符(<
、>
、<=
、>=
、==
、!=
)的实现。
假设我们有一个自定义对象 Student
,其中包含学生的姓名和年龄:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
现在我们有一个包含多个学生对象的列表:
students = [Student('Tom', 20), Student('John', 18), Student('Amy', 19)]
如果我们直接尝试对该列表进行排序,会抛出 TypeError
异常,因为 Python 不知道如何比较两个 Student
对象的大小。
为了让 Python 知道如何比较 Student
对象,我们可以在 Student
类中实现比较运算符的方法。假设我们按照学生的年龄进行排序,可以按照以下方式实现 __lt__
方法(小于运算符):
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age
现在,我们可以对包含 Student
对象的列表进行排序了:
students.sort()
for student in students:
print(student.name, student.age)
输出结果如下:
John 18
Amy 19
Tom 20
上述代码中,我们调用 sort
方法对学生列表进行排序。在排序过程中,Python 会自动调用 Student
类中实现的 __lt__
方法进行比较。
除了实现 <
运算符外,我们还可以通过实现其他比较运算符来实现不同的排序需求。
自定义排序函数
除了使用对象的比较运算符外,我们还可以通过自定义排序函数来实现对列表的排序。自定义排序函数是一个接受一个元素作为参数的函数,并返回一个排序关键字的函数。
以数字列表为例,假设我们有一个列表:
nums = [23, 10, 6, 37, 29]
如果我们要按照元素的个位数进行排序,可以定义如下的排序函数:
def last_digit(num):
return num % 10
然后,我们可以使用 sorted
函数并传入该排序函数来对列表进行排序:
sorted_nums = sorted(nums, key=last_digit)
print(sorted_nums) # 输出:[10, 23, 29, 6, 37]
上述代码中,key
参数指定了一个排序函数 last_digit
,该函数会对列表中的每个元素执行,并返回其个位数作为排序关键字。最终,sorted
函数会根据这些排序关键字对列表进行排序。
这种方式可以灵活地实现不同的排序需求,只需根据自己的实际情况定义不同的排序函数即可。
结论
本文详细介绍了 Python 中对列表排序的方法。我们可以使用内置的 sort
和 sorted
函数对数字、字符串和自定义对象列表进行排序。对于自定义对象列表,可以通过实现比较运算符的方法或者定义自定义排序函数来实现灵活的排序操作。