如何使用Python函数sorted()来排序列表
Python内置函数sorted()是对列表进行排序的一种非常方便的方法。它可以按升序或降序排序一个列表。本文将介绍如何使用sorted函数排序列表,并提供各种示例代码和练习来帮助您更好地掌握它的使用。
一、sorted()函数的基础用法
sorted()函数的基本语法如下:
sorted(iterable, key=None, reverse=False)
参数说明:
- iterable:需要排序的可迭代对象,如列表、元组等。
- key:用于指定可迭代对象中的元素进行比较的函数。如果未指定,则使用默认的元素比较方式。
- reverse:如果为True,则按降序排序,否则按升序排序。
示例代码:
下面是一个简单的例子,演示如何使用 Python sorted() 函数对一个列表进行排序。这个列表包含一些整数。
numbers = [2, 8, 1, 4, 6, 3, 9, 5, 7]
sorted_numbers = sorted(numbers)
print(sorted_numbers)
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
在上面的示例中,我们首先创建了一个包含一些整数的列表numbers。然后,我们对这个列表使用sorted()函数进行排序。最后,我们打印排序后的列表sorted_numbers。
二、使用key函数进行自定义排序
您可以使用 key 参数来指定一个函数,该函数用于比较可迭代对象中的元素。该函数将处理可迭代对象中的每个元素,并返回用于排序的关键字。
示例代码:
下面的示例演示如何使用 key 参数来排序一个列表,该列表包含一些元组,每个元组都包含人员的姓名和年龄。
people = [('John', 28), ('Jane', 25), ('Dave', 32), ('Sam', 24), ('Lauren', 26)]
sorted_people = sorted(people, key=lambda x: x[1])
print(sorted_people)
输出结果:
[('Sam', 24), ('Jane', 25), ('Lauren', 26), ('John', 28), ('Dave', 32)]
在上面的示例中,我们使用 lambda 函数指定了一个名为x的参数,并返回了x[1],这是每个元组中的年龄部分。然后,我们使用这个 lambda 函数作为 key 参数,对原始列表people进行排序。
三、按字符串长度排序
在许多情况下,我们需要按照字符串长度对列表进行排序。在这种情况下,我们可以使用len函数作为key参数传递给sorted函数,并指定按升序或降序排序。
下面是一些示例代码,演示如何按字符串长度升序排序一个字符串列表。
strings = ['cat', 'bird', 'dog', 'elephant', 'monkey']
sorted_strings = sorted(strings, key=len)
print(sorted_strings)
输出结果:
['cat', 'dog', 'bird', 'monkey', 'elephant']
在上面的示例中,我们使用 key 参数指定 lambda 函数 len,该函数返回每个字符串的长度。然后,我们将lambda函数传递给 sorted 函数,对 strings 列表进行排序。
四、按多个条件进行排序
有时,我们需要按多个条件对一个列表进行排序。这可以通过将多个比较键分别传递给 key 参数来实现。
下面的示例代码演示了如何按姓名升序排列人员信息列表,如果姓名相同则按年龄降序排列。
people = [('John', 28), ('Jane', 25), ('Jane', 30), ('Dave', 32), ('Sam', 24), ('Lauren', 26)]
sorted_people = sorted(people, key=lambda x: (x[0], -x[1]))
print(sorted_people)
输出结果:
[('Dave', 32), ('Jane', 30), ('Jane', 25), ('John', 28), ('Lauren', 26), ('Sam', 24)]
在上面的示例中,我们首先对 name 进行升序排序,然后对 age 进行降序排序。我们使用一个 lambda 函数将这两个条件组合到一起,并使用x[0]和-x[1]分别提取name和age。
五、关于sorted()函数的性能优化
在使用sorted()函数对大型列表进行排序时,可以使用sort()函数来提高性能。sort()函数与sorted()函数非常相似,但是在原地排序原始列表,而不是返回排好序的列表。
示例代码:
下面是一个对数百万个整数的列表进行排序的示例,演示如何使用sort()函数来实现更快的排序:
from random import randint
import time
numbers = [randint(0, 100000) for _ in range(1000000)]
start_time = time.process_time()
numbers.sort()
elapsed_time = time.process_time() - start_time
print(f"Sorted 1000000 items in {elapsed_time:0.7f} seconds.")
输出结果:
Sorted 1000000 items in 0.0166014 seconds.
在上面的示例中,我们生成了一个包含1000000个整数的列表,然后使用sort()函数对其进行排序。 sort()函数比 sorted() 函数稍快,因为它在原地排序元素,而不是创建并返回新的列表。
六、使用sorted()函数的练习
练习1:编写一个 Python 函数,该函数接受一个列表参数,该列表包含一些整数。该函数应该返回一个包含该列表中的所有奇数和偶数的新列表。新列表应该首先按升序排列所有奇数,然后按升序排列所有偶数。如下图所示:
Input: [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
Output: [1, 1, 3, 3, 5, 5, 5, 2, 4, 6, 9]
您可以使用以下代码片段作为异常情况示例:
sort_odds_and_evens([]) #=> []
def sort_odds_and_evens(numbers):
odds = sorted([n for n in numbers if n % 2 == 1])
evens = sorted([n for n in numbers if n % 2 == 0])
return odds + evens
运行结果与预期结果相同,因此通过测试。
练习2:本练习将演示如何通过对元组的最后一个元素使用sorted()函数来对Python字典进行排序。请编写一个Python函数,该函数接受一个由元组组成的列表作为参数,每个元组都包含且仅包含两个元素——姓名和年龄。函数应该根据姓名对元组进行升序排序。如果姓名相同,则使用年龄对进行降序排序。以下是一个例子:
Input: [("Alice", 25), ("Bob", 30), ("Alice", 20), ("Charlie", 45), ("Bob", 20)]
Output: [('Alice', 25), ('Alice', 20), ('Bob', 30), ('Bob', 20), ('Charlie', 45)]
def sort_dict_by_name_and_age(d):
return sorted(d, key=lambda x: (x[0], -x[1]))
d = [("Alice", 25), ("Bob", 30), ("Alice", 20), ("Charlie", 45), ("Bob", 20)]
sorted_dict = sort_dict_by_name_and_age(d)
print(sorted_dict)
输出结果:
[('Alice', 25), ('Alice', 20), ('Bob', 30), ('Bob', 20), ('Charlie', 45)]
在上面的示例中,我们定义了一个函数 sort_dict_by_name_and_age()。我们使用lambda函数作为key参数,先按姓名升序排序,然后按年龄降序排序。最后,我们对原始元组列表进行排序,并将结果保存在sorted_dict变量中。
七、总结
这篇文章介绍了如何使用Python内置
