如何在 Python 中对列表进行排序

深入解析Python列表排序技巧

本篇文章旨在引导您掌握Python中列表排序的各种方法。在Python中,您可以使用sort()方法直接修改列表进行排序,或者利用内置的sorted()函数获取一个排序后的列表副本,而不会更改原始列表。

通过本教程,您将学习:

  • sort()方法和sorted()函数的具体用法。
  • 如何实现列表的升序和降序排列。
  • 如何利用key参数进行自定义排序。
  • sort()sorted()函数之间的本质区别。

让我们开始您的Python排序之旅吧!

Python sort() 方法的语法结构

sort()方法是Python列表对象的一个方法,它直接对列表进行排序,且会修改原始列表的顺序。该方法的语法结构如下:

<list>.sort(reverse = True | False, key = <func>)

让我们详细解读一下这个语法:

  • <list> 代表任何有效的Python列表对象。
  • reverse 是一个可选参数,接受TrueFalse
  • reverse 默认为False,表示升序排列。若设置为True,则列表将以降序排列。
  • key 也是一个可选参数,其值需设置为一个函数<func>
  • <func> 可以是Python内置函数,也可以是用户自定义的函数。

在接下来的部分,我们将通过实际例子来演示这些参数的使用。

如何对Python列表进行升序排序

假设我们有一个名为nums的列表。要对其进行升序排序,可以直接调用列表的sort()方法,如下所示:

nums = [25,13,6,17,9]
nums.sort()
print(nums)
# 输出: [6, 9, 13, 17, 25]

可以看到,nums列表已经被原地修改为升序排列。这被称为原地排序。

如何对Python列表进行降序排序

要以降序排列列表,只需将reverse参数设置为True,就像这样:

nums = [25,13,6,17,9]
nums.sort(reverse = True)
print(nums)
# 输出: [25, 17, 13, 9, 6]

现在列表已经成功地按降序排列。

如何在sort()方法中使用key参数

本节我们将学习如何使用key参数来自定义排序规则。 假设我们有一个函数mod5(),它返回一个数字除以5的余数:

def mod5(x):
  return x % 5

现在,我们想用这个函数作为排序的依据。代码如下:

nums = [25,13,6,17,9]
nums.sort(key = mod5)
print(nums)
# 输出: [25, 6, 17, 13, 9]

请仔细观察输出。排序不再是简单的数字大小比较,而是根据mod5()函数返回的余数进行。余数小的数字在前,余数大的在后。

  • 除以5余数最小的排在最前面。
  • 除以5余数最大的则排在最后。

我们可以通过以下代码验证这一点:

nums = [25,13,6,17,9]
for num in nums:
  print(f"{num} 除以 5 的余数是 {num%5}")
# 输出
# 25 除以 5 的余数是 0
# 13 除以 5 的余数是 3
# 6 除以 5 的余数是 1
# 17 除以 5 的余数是 2
# 9 除以 5 的余数是 4

余数为0的25排在第一,余数为1的6排在第二,以此类推。除了使用自定义函数,我们还可以使用lambda函数来简化这个过程。lambda函数是Python中一种简洁的匿名函数。它的基本形式是lambda args : expression,它返回一个根据args计算后的expression的值。 我们可以像下面这样使用lambda函数重写上面的排序代码:

nums = [25,13,6,17,9]
nums.sort(key = lambda x:x%5)
print(nums)
# 输出: [25, 6, 17, 13, 9]

至此,我们已经学习了如何对数字列表进行排序。接下来,我们将探讨如何对字符串列表进行排序。

如何按字母顺序对Python列表进行排序

接下来,我们学习如何对字符串列表进行排序。以哈利波特为主题,假设我们有一个名为students的列表,其中包含了霍格沃茨的学生姓名。我们想按照他们名字的字母顺序进行排列。

students = ["Harry","Ron","Hermione","Draco","Cedric"]

默认情况下,对字符串列表进行排序时,会按照字母顺序进行。

students.sort()
print(students)
# 输出
# ['Cedric', 'Draco', 'Harry', 'Hermione', 'Ron']

如何按字母逆序对Python列表进行排序

要按字母逆序排列列表,只需将reverse参数设置为True

students.sort(reverse = True)
print(students)
# 输出
# ['Ron', 'Hermione', 'Harry', 'Draco', 'Cedric']

从输出结果可以看出,列表确实按字母逆序排列了。

如何使用key参数进行自定义排序

本节我们将继续学习如何利用key参数自定义排序规则。假设我们有以下列表houses

houses = [
            {1:"Draco","house":"Slytherin"},
            {2:"Harry","house":"Gryffindor"},
            {3:"Cedric","house":"Hufflepuff"}
         ]

houses是一个字典列表。每个字典包含两个键值对,一个表示学生的姓名,另一个表示他们所属的学院。现在,我们想按照学生所属学院的字母顺序对列表进行排序。我们应该将key参数设置为每个学生的学院。为了提取每个学生的学院,我们定义一个returnHouse()函数:

def returnHouse(student):
  return student['house']

该函数返回给定学生所属的学院。接下来,我们可以将此函数应用于houses列表的sort()方法:

houses.sort(key=returnHouse)

下面的输出中,列表不再按照学生姓名排序,而是按照学院的字母顺序排列。结果为格兰芬多、赫奇帕奇和斯莱特林,按照字母顺序。

print(houses)
# 输出
# [{2: 'Harry', 'house': 'Gryffindor'}, 
# {3: 'Cedric', 'house': 'Hufflepuff'}, 
# {1: 'Draco', 'house': 'Slytherin'}]

当然,我们也可以使用lambda函数实现同样的效果:

houses.sort(key=lambda student:student["house"])
print(houses)
# 输出
# [{2: 'Harry', 'house': 'Gryffindor'}, 
# {3: 'Cedric', 'house': 'Hufflepuff'}, 
# {1: 'Draco', 'house': 'Slytherin'}]

到目前为止的所有例子中,我们都使用了列表的sort()方法。这种方法会修改原始列表。那么,如果我们既想保留原始列表,又想获得一个排序后的副本呢?这时候,我们就可以使用Python的sorted()函数。

Python sorted() 函数的语法结构

sorted()函数接受一个列表或任何可迭代对象作为参数,并返回一个新的、已排序的列表,而不会修改原始列表。sorted()函数的语法如下:

<sorted_copy> = sorted(<list>, reverse = True | False, key = <func>)

请注意,该语法与sort()方法非常相似。

  • <list> 代表任何有效的Python列表对象,并且是必须的参数。
  • reversekey是可选参数。

与只适用于列表的sort()方法不同,sorted()函数可以用于排序任何Python可迭代对象,比如列表、字符串和字典。

如何使用sorted()函数对Python列表进行排序

例子1: 使用sorted()函数对数字列表进行排序。

nums = [25,13,6,17,9]
sorted_nums1 = sorted(nums)
print(sorted_nums1)
# 输出: [6, 9, 13, 17, 25]

输出结果显示,默认情况下,nums列表按升序排列。此外,请注意原始列表nums没有被修改,因为sorted()函数返回的是一个新的列表,如下面代码验证:

print(nums)
# 输出: [25, 13, 6, 17, 9]

例子2: 现在,将可选参数reverse设置为True,并将结果赋值给sorted_nums2

sorted_nums2 = sorted(nums,reverse = True)
print(sorted_nums2)
# 输出: [25, 17, 13, 9, 6]

可以看到,sorted_nums2是一个新的列表,里面的元素按降序排列。

例子3: 下面我们将使用字符串列表:

fruits = ['pears','strawberry','apple','pineapple','blueberry']
sorted_fr1 = sorted(fruits)
print(sorted_fr1)
# 输出:
# ['apple', 'blueberry', 'pears', 'pineapple', 'strawberry']

正如前面的例子,调用sorted()函数会返回一个新的列表,且元素按字母顺序排列。

例子4:现在,让我们使用可选的key参数自定义排序。我们将key设置为len。这将根据字符串的长度对列表进行排序。

注意:在Python中,内置的len()函数接收任何可迭代对象,如列表、字符串、元组等,并返回其长度。

fruits = ['pear','strawberry','apple','pineapple','blueberry']
sorted_fr2 = sorted(fruits,key=len)
print(sorted_fr2)
# 输出:
# ['pear', 'apple', 'pineapple', 'blueberry', 'strawberry']

长度最短的字符串排在列表最前面,最长的字符串排在最后面。

sort()方法与sorted()函数的对比

至此,我们学习了sort()方法和sorted()函数的使用。下面总结一下二者的区别:

Python .sort() 方法 Python sorted() 函数
对列表进行原地排序,会修改原始列表 返回一个新的排序后的列表,不修改原始列表
仅适用于Python列表 适用于Python可迭代对象,如列表,字符串和其他集合
返回值为None 返回可迭代对象的排序副本

总结

希望本Python列表排序教程对您有所帮助。让我们快速回顾一下所学的知识:

  • 使用list.sort(reverse = True | False, key = <func>)原地排序列表,可以选用reversekey参数。
  • 使用sorted(list, reverse = True | False, key = <func>)获取列表的排序副本。

现在您已经学会如何对Python列表进行排序了。接下来可以学习Python中的列表推导式、文件处理或JSON文件操作。您可以在techblik.com在线Python编译器中实践以上示例。