Python 列表排序: 解释和例子
数据排序是编程中的一个基本算法,也是现实世界开发中最经常执行的任务之一。 由于它的重要性,Python在不同的函数或方法中提供了几种排序的方法。 尽可能多地使用Python的内置函数是一个好主意,因为在大多数情况下,它们比你自己写代码更可靠、更快速。
所以在这篇文章中,我们将看一看 Python 提供的列表排序方法。
从基本的sorted()
函数或sort()
方法开始,我们将涵盖几种情况。
1. sorted()函数,它返回一个新的排序的列表
sorted()
函数是一个内置函数,它接收给定的列表作为参数,并返回一个按升序排序的新列表。原有的列表则保持不变。
要使用 sorted()
函数,请将你要排序的列表作为参数传入,如下图。
unsorted_list = [5, 2, 8, 1, 3]
sorted_list = sorted(unsorted_list)
print(sorted_list) # Output: [1, 2, 3, 5, 8]
2. 用反向参数进行降序排序
sorted()
函数需要两个参数,key
和reverse
。
其中,reverse
参数用于传递是否需要降序排序,如果你传递给它的值是True
,它将以降序排序。
正如我们在第1节中看到的,sorted()
函数默认以升序排序的原因是这个参数默认为False
。
unsorted_list = [5, 2, 8, 1, 3]
sorted_list = sorted(unsorted_list, reverse=True)
print(sorted_list) # Output: [8, 5, 3, 2, 1]
3. 使用key参数按自定义标准排序
如果你想使用sorted()
函数按照升序或降序以外的自定义标准排序,请使用key
参数。
我们可以向key
参数传递一个内置或自定义的函数来应用新的排序标准。
让我们先看一个通过传递内置函数进行排序的例子。
我们将Python内置函数len
传递给key函数,并通过其返回值,即字符串的长度进行排序。
注意,我们没有为reverse
参数传递一个值,所以它以升序进行排序。
words = ['apple', 'banana', 'cherry', 'date', 'fig']
sorted_words = sorted(words, key=len)
print(sorted_words) # Output: ['fig', 'date', 'apple', 'banana', 'cherry']
下面是一个通过传递一个用lambda
函数定义的自定义函数进行排序的例子。
要按年龄值组织几个有姓名和年龄值的字典、
在lambda函数中,我们把列表中的每个成员作为user
,并得到与age
键对应的值来排序。
users = [
{
'name': 'Alice',
'age': 30
},
{
'name': 'Bob',
'age': 25
},
{
'name': 'Charlie',
'age': 35
},
{'
name': 'David',
'age': 28
}
]
sorted_users = sorted(users, key=lambda user: user['age'])
print(sorted_users)
4. 按多个标准进行排序
要按多个标准排序,只需从key
函数中返回一个所需标准值的元组。
下面的例子是按评级和发行年份对电影数据进行排序。 'Memento'和'Prestige',它们有相同的评级,再次按发行年份排序。
movies = [
{
'title': 'Inception',
'year': 2010,
'rating': 8.8
},
{
'title': 'Interstellar',
'year': 2014,
'rating': 8.6
},
{
'title': 'The Prestige',
'year': 2006,
'rating': 8.5
},
{
'title': 'Memento',
'year': 2000,
'rating': 8.5
}
]
sorted_movies = sorted(movies, key=lambda movie: (movie['rating'], movie['year']))
print(sorted_movies)
5. list.sort()方法,返回值 None
list.sort()
方法是 Python list 类的主要内置方法。
与我们前面看到的 sorted() 函数 不同,这个方法将 list 本身放入排序状态,并返回 None
。
sort()[:py}
方法可以在你想要排序的列表上调用,如下面的代码所示。
unsorted_list = [5, 2, 8, 1, 3]
unsorted_list.sort()
print(unsorted_list) # Output: [1, 2, 3, 5, 8]
sort()
方法也有两个参数: key
和reverse
。它们的作用与sorted(
函数相同。
unsorted_list = [5, 2, 8, 1, 3]
unsorted_list.sort(reverse=True)
print(unsorted_list) # Output: [8, 5, 3, 2, 1]
names = ['Alice', 'Bob', 'Charlie', 'David']
names.sort(key=len)
print(names) # Output: ['Bob', 'Alice', 'David', 'Charlie']
6. list.sort() 方法与 sorted() 函数的区别
在 Python 中用于排序的两种方法的主要区别在于它们是否对原始列表进行操作。
list.sort()
方法对原始列表进行排序。
它不保留原始列表。sorted()
函数保留原始列表并返回一个新的排序列表。
list.sort()
方法的优点是使用较少的内存,而sorted()
函数的优点是保留了原始列表,并且可以与许多函数式编程函数一起使用。
lista_original = [5, 2, 8, 1, 3]
lista_ordenada = sorted(lista_original)
print(lista_original) # Output: [5, 2, 8, 1, 3]
print(lista_ordenada) # Output: [1, 2, 3, 5, 8]
lista_original.sort()
print(lista_original) # Output: [1, 2, 3, 5, 8]
7. Python的排序算法:TimSort
现代Python中用于排序列表的默认排序算法是TimSort。 这种算法是由Tim Peters开发的,并在2002年首次引入Python。 此后,它被用于Java和许多其他编程语言和系统,包括Android和Swift。
TimSort是一种结合了合并排序和插入排序的排序算法。 它的工作原理是对部分数据进行插入排序,然后与合并排序相结合。 这样做的好处是,如果数据的某些部分已经被排序,那么速度会非常快。
TimSort的最坏情况下的时间复杂度为O(n log n)
,对于已经排序的列表,其线性时间复杂度为O(n)
。
总结
在这篇文章中,我们已经介绍了Python中列表排序的基础知识,包括关键函数和算法的使用。 我们希望这对你自己的开发有帮助。
