python sorted函数原理解析及练习

1. Python sorted函数介绍

Python中的sorted()函数作用是对可迭代对象进行排序,其返回值为一个新的列表。sorted()函数能够按升序对元素进行排序,同时还可以指定降序排序。sorted()函数具有稳定性,可以保证排序后的元素排列顺序符合预期。

Python中sorted函数的语法为:

sorted(iterable, key=None, reverse=False)

iterable:可迭代对象,例如列表、元组等。

key:排序函数,可以对元素进行自定义排序,默认使用元素自身的值进行比较。

reverse:排序方式,指定为True时倒序排序,默认为False。

2. Python sorted函数原理解析

2.1 sorted函数的排序算法

Python中的sorted()函数使用了Timsort排序算法,它是一种融合了归并排序和插入排序特点的排序算法,内存占用小,速度快,同时也具有稳定性。

Timsort算法的核心思路是寻找有序子序列,并对这些子序列进行合并,直到最后得到一个完全有序的序列。该算法在排序时需要保持每个有序子序列具有一定的长度,这个长度称为minrun。同时,还需要利用一个堆栈来存储各个子序列。

2.2 sorted函数的sorted()函数的实现机制

在Python中,sorted()函数是由列表对象内置方法sort()实现的。sort()函数会对列表自身进行排序,而不是创建新的列表。sorted()函数会先创建一个新的列表,然后对新的列表进行排序操作,并返回这个新的列表。同时,在对新的列表排序时,sorted()函数还可以接收一个关键字参数key,这个参数用于对列表元素进行排序前的处理。

2.3 sorted函数的算法实现流程

接下来我们通过一个例子来简单说明sorted()函数的算法实现流程:

a = [3, 1, 4, 2] # 定义一个列表

b = sorted(a) # 对列表进行排序

上面的代码中,我们定义了一个列表a,然后使用sorted()函数对其进行排序,并将结果赋值给变量b。

sorted()函数的实现步骤如下:

判断传入对象是否是字符串,如果是字符串,则将其转换为单个字符列表。

生成一个全新的列表对象,将传入的可迭代对象的所有元素复制到这个列表中。

优化新列表的大小,优化方法如下:

如果新列表的长度小于等于十,则使用插入排序算法对其进行排序。

否则,确定minrun的大小,根据minrun的大小来拆分当前列表,并对每个子序列进行排序,使其有序。

然后,将排序后的子序列按照规则合并,并重复进行合并、排序,直到最终得到一个完全有序的序列。

返回完全有序的新列表。

3. Python sorted函数练习

3.1 使用sorted函数对数字类型进行排序

Python中使用sorted()函数对数字类型进行排序非常简单,只需要将要排序的数字类型放入一个可迭代对象中,然后传递到sorted()函数中即可。以下代码展示了如何使用sorted()函数对数字类型进行排序:

# 对数字类型进行排序

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]

# 默认升序排序

sorted_numbers = sorted(numbers)

print(sorted_numbers) # [1, 1, 2, 3, 3, 4, 5, 5, 6, 9]

# 指定降序排序

reverse_numbers = sorted(numbers, reverse=True)

print(reverse_numbers) # [9, 6, 5, 5, 4, 3, 3, 2, 1, 1]

上面的代码中,我们定义了一个数字类型的列表numbers,然后分别使用sorted()函数对其进行默认升序排序和指定降序排序。

3.2 使用sorted函数对字符串类型进行排序

与数字类型相同,使用sorted()函数对字符串类型进行排序也非常简单。该过程涉及到字符串的比较操作,字符串的比较按照ASCII顺序来进行。以下代码展示了如何使用sorted()函数对字符串类型进行排序:

# 对字符串类型进行排序

words = ['Python', 'Java', 'C++', 'Perl', 'JavaScript']

sorted_words = sorted(words)

print(sorted_words) # ['C++', 'Java', 'JavaScript', 'Perl', 'Python']

# 指定降序排序

reverse_words = sorted(words, reverse=True)

print(reverse_words) # ['Python', 'Perl', 'JavaScript', 'Java', 'C++']

上面的代码中,我们定义了一个字符串类型的列表words,先使用sorted()函数进行默认升序排序,然后使用reverse参数指定降序排序。

3.3 使用sorted函数按照指定规则排序

sorted()函数除了在默认情况下按照升序排列外,还能够以指定的规则进行排序。例如,可以指定按照字符串长度排序。以下代码示例展示了如何使用sorted()函数按照字符串长度进行排序:

# 使用key函数按字符串长度排序

words = ['hello', 'python', 'world', 'java']

sorted_words_by_length = sorted(words, key=len)

print(sorted_words_by_length) # ['java', 'hello', 'world', 'python']

# 使用lambda表达式按字符串最后一位字符进行排序

sorted_words_by_last_letter = sorted(words, key=lambda x: x[-1])

print(sorted_words_by_last_letter) # ['world', 'python', 'hello', 'java']

上面的代码中,我们使用sorted()函数对字符串列表进行排序。第一个示例按字符串长度进行排序,使用字符串的内置函数len()作为排序规则。第二个示例按照字符串的最后一位字符进行排序,使用lambda表达式作为排序规则。

4. 总结

sorted()函数是Python内置的一个非常有用的排序函数,它能够对可迭代对象进行排序,并且具有稳定性。在Python中,sorted()函数通过Timsort排序算法实现,该算法将归并排序与插入排序特点融合在一起,具有内存占用小、速度快和稳定性等特点。

同时,sorted()函数还可以按照指定规则进行排序,例如可以按照字符串长度或者字符串最后一位字符进行排序。掌握sorted()函数的使用方法以及其背后的实现原理,有助于我们更好地理解Python内部的工作原理,并且可以对我们的开发工作有所帮助。

后端开发标签