Python列表排序:深入探讨sort()和sorted() |
您所在的位置:网站首页 › python列表降序升序 › Python列表排序:深入探讨sort()和sorted() |
更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python列表排序:深入探讨sort()和sorted(),全文4700字,阅读大约15分钟。 在Python中,列表排序是一项常见而重要的任务。本文将深入研究列表排序的两种主要方法:sort() 方法和 sorted() 函数。通过详细的解释和丰富的示例代码,将全面探讨如何灵活、高效地利用这两种方式进行列表排序。 sort() 方法的基本用法sort() 方法是列表对象的一个内置方法,能够直接对原始列表进行排序。 以下是一个基本的用法示例: numbers = [4, 1, 7, 3, 9, 2] numbers.sort() print(numbers) # 输出:[1, 2, 3, 4, 7, 9]sort() 方法默认按升序排序,同时也支持降序排序: numbers = [4, 1, 7, 3, 9, 2] numbers.sort(reverse=True) print(numbers) # 输出:[9, 7, 4, 3, 2, 1] sort() 方法的高级用法 1 自定义排序关键字sort() 方法还允许通过关键字参数 key 指定一个自定义的排序函数。 以下是一个按字符串长度排序的示例: words = ["apple", "banana", "orange", "kiwi"] words.sort(key=len) print(words) # 输出:['kiwi', 'apple', 'banana', 'orange'] 2 使用lambda函数通过 lambda 函数,可以更灵活地定义排序规则。例如,按单词的最后一个字母进行排序: words = ["apple", "banana", "orange", "kiwi"] words.sort(key=lambda x: x[-1]) print(words) # 输出:['banana', 'kiwi', 'apple', 'orange'] sorted() 函数的基本用法与 sort() 方法不同,sorted() 函数不会修改原始列表,而是返回一个新的已排序列表。 以下是 sorted() 函数的基本用法: numbers = [4, 1, 7, 3, 9, 2] sorted_numbers = sorted(numbers) print(sorted_numbers) # 输出:[1, 2, 3, 4, 7, 9] print(numbers) # 输出:[4, 1, 7, 3, 9, 2](原列表未改变) sorted() 函数的高级用法 1 反向排序与 sort() 方法类似,sorted() 函数也支持 reverse 参数,用于进行降序排序: numbers = [4, 1, 7, 3, 9, 2] sorted_numbers_desc = sorted(numbers, reverse=True) print(sorted_numbers_desc) # 输出:[9, 7, 4, 3, 2, 1] 2 自定义排序函数利用 key 参数,可以实现与 sort() 方法相似的自定义排序: words = ["apple", "banana", "orange", "kiwi"] sorted_words = sorted(words, key=len) print(sorted_words) # 输出:['kiwi', 'apple', 'banana', 'orange'] 3 使用 operator 模块operator 模块提供了一些方便的函数,可用于更复杂的排序操作。 例如,按元组的第二个元素进行排序: import operator data = [(1, 5), (3, 2), (7, 8), (4, 1)] sorted_data = sorted(data, key=operator.itemgetter(1)) print(sorted_data) # 输出:[(4, 1), (3, 2), (1, 5), (7, 8)] 性能比较和选择性能比较在选择使用 sort() 方法还是 sorted() 函数时至关重要。理解它们的性能特征有助于在不同场景中做出明智的选择。 sort() 方法的性能:sort() 方法是一个原地排序方法,直接修改原始列表,因此在内存使用方面更为高效。它采用Timsort算法,结合了归并排序和插入排序的优点,对于大型数据集,sort() 方法通常表现得更出色。这是因为它避免了创建新的数据结构,直接在原有列表上进行排序操作,节省了额外的内存开销。 numbers = [4, 1, 7, 3, 9, 2] numbers.sort() sorted() 函数的性能:sorted() 函数创建一个新的已排序列表,不修改原始列表,因此在某些情况下更安全。但是,由于它需要额外的内存来存储新的列表,对于大型数据集可能会引起内存开销较大的问题。特别是当原始数据集很大时,sorted() 可能不如 sort() 方法效率高。 numbers = [4, 1, 7, 3, 9, 2] sorted_numbers = sorted(numbers) 如何选择:数据集大小: 对于大型数据集,尤其是内存有限的情况下,推荐使用 sort() 方法以降低内存压力。 原始数据保留: 如果需要保留原始数据的顺序,或者避免直接修改原始数据,可以选择使用 sorted() 函数。 性能需求: 如果性能是首要考虑因素,且没有保留原始数据的需求,那么 sort() 方法通常是更好的选择。 稳定性: 由于 sort() 方法是原地排序,它在某些情况下可能不够稳定。如果稳定性对任务至关重要,可以考虑使用 sorted() 函数。 在实际应用中,根据任务需求综合考虑这些因素,选择适合的排序方式,以便在保证性能的同时满足其他需求。 探索稳定性和复杂对象排序 1 稳定性在排序时,稳定性是一个重要的概念。稳定排序意味着如果有两个元素相等,排序后它们的相对顺序不会改变。Python的 sorted() 函数是稳定的,而 sort() 方法通常也是稳定的。 data = [(1, 2), (3, 2), (1, 1), (3, 1)] sorted_data = sorted(data, key=lambda x: x[0]) print(sorted_data) # 输出:[(1, 2), (1, 1), (3, 2), (3, 1)](维持相对顺序) 2 对象排序当处理复杂对象时,可以通过定义对象的 __lt__(小于)、__le__(小于等于)等特殊方法,使对象具有可比性,从而能够进行排序。 class Person: def __init__(self, name, age): self.name = name self.age = age def __lt__(self, other): return self.age |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |