深入解析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
是一个可选参数,接受True
或False
。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列表对象,并且是必须的参数。reverse
和key
是可选参数。
与只适用于列表的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>)
原地排序列表,可以选用reverse
和key
参数。 - 使用
sorted(list, reverse = True | False, key = <func>)
获取列表的排序副本。
现在您已经学会如何对Python列表进行排序了。接下来可以学习Python中的列表推导式、文件处理或JSON文件操作。您可以在techblik.com在线Python编译器中实践以上示例。