Python 中 sort() 和 sorted() 的区别

Vaibhav Vaibhav 2023年1月30日 2021年12月4日
  1. Python 中的 sort() 函数
  2. Python 中的 sorted() 函数
Python 中 sort() 和 sorted() 的区别

排序是计算机科学领域中非常重要的一个话题。有许多算法可用于对数据数组进行排序,例如归并排序、快速排序、冒泡排序、选择排序、插入排序等。所有这些算法都有不同的时间和空间复杂度,但通常认为合并和快速是最好的。由于排序是一种非常常见的操作,因此编程语言包含用于对数据进行排序的内置函数。Python 就是其中之一。

但是,Python 中有两个用于排序的函数,即 sortsorted。在本文中,我们将了解这两种排序功能之间的区别。

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 变量中。两个参数,即 reversekey,在这个函数中也可用。使用这两者,我们可以得到一个倒序排序的列表,并根据自定义键对列表进行排序。以下示例描述了相同的情况。

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}]
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub

相关文章 - Python Sorting