Python中如何实现sort()和sorted()函数的排序操作?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1157个文字,预计阅读时间需要5分钟。
Python 的排序功能确实内置了 `sort()` 和 `sorted()` 两个函数。它们的主要区别在于:
- `sort()` 是对列表(list)进行原地排序,即排序后的结果会直接修改原列表。- `sorted()` 返回一个新的列表,不会修改原列表。
下面是这两个函数的定义和简要说明:
`sorted(iterable, key=None, reverse=False)`
- `iterable`:需要排序的可迭代对象。- `key`:一个函数,用于从每个元素中提取排序的键。如果未提供,则使用元素本身。- `reverse`:一个布尔值,指定是否按降序排序。
例如:
python使用 sorted() 对列表进行排序numbers=[3, 1, 4, 1, 5, 9, 2, 6]sorted_numbers=sorted(numbers)print(sorted_numbers) # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
使用 sort() 对列表进行原地排序numbers.sort()print(numbers) # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
大家都知道,python排序有内置的排序函数 sort() 和 高阶函数sorted() 。但是它们有什么区别呢?
让我们先从这个函数的定义说起:
- sorted():该函数第一个参数iterable为任意可以迭代的对象,cmp是比较函数,通常为lambda函数,key是用于比较的关键字,reverse表示排序结果是否反转。
- L.sort():该函数的三个参数和 sorted() 的后三个参数含义是一致的,而需要特别注意的是,该函数只适用于列表,而非任意可以迭代的对象。cmp是比较函数,接受两个对象参数 x 和 y,返回 负数(x<y),0(x=y),正数(x>y)
L.sort() 这里需要注意的一点是,调用 L.sort() 完成排序后,改变了要排序的列表的结构
A = [3,6,1,5,4,2]A.sort() // [1, 2, 3, 4, 5, 6]student = [['Tom', 'A', 20], ['Jack', 'C', 18], ['Andy', 'B', 11]]
student.sort(key=lambda student: student[2])
学生列表中包含列表,每个列表是学生的姓名、成绩以及年龄,排序过程中指定了key为学生的年龄,所以排序的结果为:[['Andy', 'B', 11], ['Jack', 'C', 18], ['Tom', 'A', 20]]student = [['Tom', 'A', 20], ['Jack', 'C', 18], ['Andy', 'B', 11]]
student.sort(cmp=lambda x, y: x[2] - y[2])
通过定义 key 和 cmp 都可以完成排序,但是这两者之间有什么区别呢?cmp传入的函数在整个排序过程中会调用多次,因为会进行多次比较,所以函数调用开销较大,因此使用 key 的效率比 cmp 的效率要高。
sorted() sorted()可以应用于任意的可以迭代的对象,所以应用范围比L.sort() 广泛的多,可以应用于字符串,元组,列表,字典等可迭代对象。
B = 'Python'sorted(B)
C = (3, 6, 1, 5, 4, 2)
sorted(C)
D = [3, 6, 1, 5, 4, 2]
sorted(D)
E = {'1': 'a', '2': 'b', '0': 'c'}
sorted(E.items())
需要注意的是,该函数会返回一个排序后的列表,原有可迭代对象保持不变,这与 L.sort() 函数不同。然而,这会浪费较大的存储空间,尤其是数据量较大时。所以,在列表进行排序时,需要考虑是否需要保存原列表,如果无需保存原列表,则优先使用L.sort() 节省内存空间,提高效率。
有的排序可能需要根据两个关键字,常用的比如单词的排序,第一个字母相同然后根据第二个字母排序,Python中的 sorted() 函数是否支持这种实现呢?答案是肯定的,再设置 key 时指定多个属性即可:
L = ['cat', 'binary', 'big', 'dog']print sorted(L, key=lambda x: (x[0], x[1], x[2]))
['big', 'binary', 'cat', 'dog']
总结
- L.sort() 函数只适用于列表排序,而sorted()函数适用于任意可以迭代的对象排序。
- L.sort() 函数排序会改变原有的待排序列表,而sorted()函数则不会改变。所以在使用列表进行排序时,需要考虑是否需要保存原列表,如果无需保存原列表,则优先使用L.sort() 节省内存空间,提高效率。
- 两个函数通过定义 key 和 cmp 都可以完成排序,但是 key 的效率要远远高于 cmp,所以要优先使用 key 。
本文共计1157个文字,预计阅读时间需要5分钟。
Python 的排序功能确实内置了 `sort()` 和 `sorted()` 两个函数。它们的主要区别在于:
- `sort()` 是对列表(list)进行原地排序,即排序后的结果会直接修改原列表。- `sorted()` 返回一个新的列表,不会修改原列表。
下面是这两个函数的定义和简要说明:
`sorted(iterable, key=None, reverse=False)`
- `iterable`:需要排序的可迭代对象。- `key`:一个函数,用于从每个元素中提取排序的键。如果未提供,则使用元素本身。- `reverse`:一个布尔值,指定是否按降序排序。
例如:
python使用 sorted() 对列表进行排序numbers=[3, 1, 4, 1, 5, 9, 2, 6]sorted_numbers=sorted(numbers)print(sorted_numbers) # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
使用 sort() 对列表进行原地排序numbers.sort()print(numbers) # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
大家都知道,python排序有内置的排序函数 sort() 和 高阶函数sorted() 。但是它们有什么区别呢?
让我们先从这个函数的定义说起:
- sorted():该函数第一个参数iterable为任意可以迭代的对象,cmp是比较函数,通常为lambda函数,key是用于比较的关键字,reverse表示排序结果是否反转。
- L.sort():该函数的三个参数和 sorted() 的后三个参数含义是一致的,而需要特别注意的是,该函数只适用于列表,而非任意可以迭代的对象。cmp是比较函数,接受两个对象参数 x 和 y,返回 负数(x<y),0(x=y),正数(x>y)
L.sort() 这里需要注意的一点是,调用 L.sort() 完成排序后,改变了要排序的列表的结构
A = [3,6,1,5,4,2]A.sort() // [1, 2, 3, 4, 5, 6]student = [['Tom', 'A', 20], ['Jack', 'C', 18], ['Andy', 'B', 11]]
student.sort(key=lambda student: student[2])
学生列表中包含列表,每个列表是学生的姓名、成绩以及年龄,排序过程中指定了key为学生的年龄,所以排序的结果为:[['Andy', 'B', 11], ['Jack', 'C', 18], ['Tom', 'A', 20]]student = [['Tom', 'A', 20], ['Jack', 'C', 18], ['Andy', 'B', 11]]
student.sort(cmp=lambda x, y: x[2] - y[2])
通过定义 key 和 cmp 都可以完成排序,但是这两者之间有什么区别呢?cmp传入的函数在整个排序过程中会调用多次,因为会进行多次比较,所以函数调用开销较大,因此使用 key 的效率比 cmp 的效率要高。
sorted() sorted()可以应用于任意的可以迭代的对象,所以应用范围比L.sort() 广泛的多,可以应用于字符串,元组,列表,字典等可迭代对象。
B = 'Python'sorted(B)
C = (3, 6, 1, 5, 4, 2)
sorted(C)
D = [3, 6, 1, 5, 4, 2]
sorted(D)
E = {'1': 'a', '2': 'b', '0': 'c'}
sorted(E.items())
需要注意的是,该函数会返回一个排序后的列表,原有可迭代对象保持不变,这与 L.sort() 函数不同。然而,这会浪费较大的存储空间,尤其是数据量较大时。所以,在列表进行排序时,需要考虑是否需要保存原列表,如果无需保存原列表,则优先使用L.sort() 节省内存空间,提高效率。
有的排序可能需要根据两个关键字,常用的比如单词的排序,第一个字母相同然后根据第二个字母排序,Python中的 sorted() 函数是否支持这种实现呢?答案是肯定的,再设置 key 时指定多个属性即可:
L = ['cat', 'binary', 'big', 'dog']print sorted(L, key=lambda x: (x[0], x[1], x[2]))
['big', 'binary', 'cat', 'dog']
总结
- L.sort() 函数只适用于列表排序,而sorted()函数适用于任意可以迭代的对象排序。
- L.sort() 函数排序会改变原有的待排序列表,而sorted()函数则不会改变。所以在使用列表进行排序时,需要考虑是否需要保存原列表,如果无需保存原列表,则优先使用L.sort() 节省内存空间,提高效率。
- 两个函数通过定义 key 和 cmp 都可以完成排序,但是 key 的效率要远远高于 cmp,所以要优先使用 key 。

