Python 中 sort() 和 sorted() 的区别
排序是计算机科学领域中非常重要的一个话题。有许多算法可用于对数据数组进行排序,例如归并排序、快速排序、冒泡排序、选择排序、插入排序等。所有这些算法都有不同的时间和空间复杂度,但通常认为合并和快速是最好的。由于排序是一种非常常见的操作,因此编程语言包含用于对数据进行排序的内置函数。Python 就是其中之一。
但是,Python 中有两个用于排序的函数,即 sort
和 sorted
。在本文中,我们将了解这两种排序功能之间的区别。
Python 中的 sort()
函数
Python 中的 sort
函数通过交换索引处的值对列表进行原地排序。当我们对一个列表调用 sort
函数时,不会返回一个新列表;相反,相同的列表被排序。sort()
函数可用于对列表进行排序。
示例请参考以下代码。
myList = [1, 5, 2, 10, 33, 3, 9]
print(myList)
myList.sort()
print(myList)
输出:
[1, 5, 2, 10, 33, 3, 9]
[1, 2, 3, 5, 9, 10, 33]
正如我们所看到的,当我们对它调用 sort
函数时,对同一个列表进行了排序。
如果我们希望以相反的顺序对列表进行排序,我们也可以通过将 reverse
参数设置为 True
来实现。
相同的参考下面的代码。
myList = [1, 5, 2, 10, 33, 3, 9]
print(myList)
myList.sort(reverse=True)
print(myList)
输出:
[1, 5, 2, 10, 33, 3, 9]
[33, 10, 9, 5, 3, 2, 1]
sort
函数还有另一个参数,即 key
,可用于定义要考虑排序的值。例如,如果我们有一个对的列表,并且我们希望考虑第二个值对这些对进行排序,我们可以使用 key
参数来做到这一点。
示例请参考以下代码。
def secondElement(element):
return element[1]
data = [(1, 2), (3, 4), (5, 3), (6, 6), (3, 0), (10, 1)]
print("Before sorting:", data)
data.sort(key=secondElement)
print("After sorting:", data)
输出:
Before sorting: [(1, 2), (3, 4), (5, 3), (6, 6), (3, 0), (10, 1)]
After sorting: [(3, 0), (10, 1), (1, 2), (5, 3), (3, 4), (6, 6)]
正如我们所看到的,列表是根据对中的第二个数字进行排序的。
我们还可以使用相同的方法对字典列表进行排序。相同的参考下面的代码。
def byName(entry):
return entry["name"]
def byAge(entry):
return entry["age"]
def byRank(entry):
return entry["rank"]
data = [
{
"name": "Vaibhav",
"age": 18,
"rank": 1,
},
{
"name": "Steve",
"age": 24,
"rank": 5,
},
{
"name": "Olive",
"age": 12,
"rank": 2,
},
{
"name": "Allison",
"age": 17,
"rank": 4,
},
]
print("Original Data")
print(data)
print("Sorted by Name")
data.sort(key=byName)
print(data)
print("Sorted by Age")
data.sort(key=byAge)
print(data)
print("Sorted by Rank")
data.sort(key=byRank)
print(data)
输出:
Original Data
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
Sorted by Name
[{'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}]
Sorted by Age
[{'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Sorted by Rank
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Steve', 'age': 24, 'rank': 5}]
正如我们所看到的,字典列表中的条目是根据我们定义的键进行排序的。
Python 中的 sorted()
函数
与 sort
函数一样,sorted
也用于对列表进行排序。但是,sorted
函数返回一个新列表,而不是原地排序相同的列表。这是两个函数之间的主要区别。让我们通过一个例子来理解这一点。
myList = [1, 5, 2, 10, 33, 3, 9]
print("Before called sorted():", myList)
newList = sorted(myList)
print("After called sorted():", myList)
print("New list:", newList)
输出:
Before called sorted(): [1, 5, 2, 10, 33, 3, 9]
After called sorted(): [1, 5, 2, 10, 33, 3, 9]
New list: [1, 2, 3, 5, 9, 10, 33]
如我们所见,我们传递给 sorted
函数的列表保持不变,并返回了一个新列表,该列表存储在 newList
变量中。两个参数,即 reverse
和 key
,在这个函数中也可用。使用这两者,我们可以得到一个倒序排序的列表,并根据自定义键对列表进行排序。以下示例描述了相同的情况。
reverse
参数的示例。
myList = [1, 5, 2, 10, 33, 3, 9]
print("Before called sorted():", myList)
newList = sorted(myList, reverse=True)
print("After called sorted():", myList)
print("New list:", newList)
输出:
Before called sorted(): [1, 5, 2, 10, 33, 3, 9]
After called sorted(): [1, 5, 2, 10, 33, 3, 9]
New list: [33, 10, 9, 5, 3, 2, 1]
还有,key
参数的一个例子。
def byName(entry):
return entry["name"]
def byAge(entry):
return entry["age"]
def byRank(entry):
return entry["rank"]
data = [
{
"name": "Vaibhav",
"age": 18,
"rank": 1,
},
{
"name": "Steve",
"age": 24,
"rank": 5,
},
{
"name": "Olive",
"age": 12,
"rank": 2,
},
{
"name": "Allison",
"age": 17,
"rank": 4,
},
]
print("Original Data")
print(data)
print("Sorted by Name")
nameSorted = sorted(data, key=byName)
print(nameSorted)
print("Sorted by Age")
ageSorted = sorted(data, key=byAge)
print(ageSorted)
print("Sorted by Rank")
rankSorted = sorted(data, key=byRank)
print(rankSorted)
print("Data after all operations")
print(data)
输出:
Original Data
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
Sorted by Name
[{'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}]
Sorted by Age
[{'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Sorted by Rank
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Data after all operations
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]