Python 排序——sorted 与 sort 用法 (一)

排序问题是所有程序员一定会遇到的问题,Python内置的排序工具sort()和sorted()功能强大,可以实现自定义的复杂式排序。平时我们使用两个函数可能没有仔细研究过它们的区别,随想随用了。但实际上二者还是有很大的去别的,在一些场景中不同互换使用。

使用 sorted() 排序值

开始使用 Python 排序,首先要了解如何对数字数据和字符串数据进行排序。
1. 排序数字型数据
可以使用 Python 通过 sorted()对列表进行排序。比如定义了一个整数列表,然后使用 numbers 变量作为参数调用 sorted():

>>> numbers = [6, 9, 3, 1]
>>> sorted(numbers)
[1, 3, 6, 9]
>>> numbers
[6, 9, 3, 1]

输出是一个新的排序列表,如果打印原始变量时,原始数字变量 numbers 未改变,因为 sorted()只提供已排序的输出,而不会更改原始值。这意味着 sorted() 可以在列表中使用,将输出立即分配给变量:

>>> numbers = [6, 9, 3, 1]
>>> numbers_sorted = sorted(numbers)
>>> numbers_sorted
[1, 3, 6, 9]
>>> numbers
[6, 9, 3, 1]

我们还可以通过调用 sorted 的 help() 来确认所有这些观察结果。可选参数 key 和 reverse 将在后面介绍:

>>> # Python 3
>>> help(sorted)
Help on built-in function sorted in module builtins:

sorted(iterable, /, *, key=None, reverse=False)
    Return a new list containing all items from the iterable in ascending order.

    A custom key function can be supplied to customize the sort order, and the
    reverse flag can be set to request the result in descending order.

像操作列表一样,sorted() 也可同样地用于元组和集合:

>>> numbers_tuple = (6, 9, 3, 1)
>>> numbers_set = {5, 5, 10, 1, 0}
>>> numbers_tuple_sorted = sorted(numbers_tuple)
>>> numbers_set_sorted = sorted(numbers_set)
>>> numbers_tuple_sorted
[1, 3, 6, 9]
>>> numbers_set_sorted
[0, 1, 5, 10]

注意到,即使输入一个集合和一个元组,输出也是一个列表,因为 sorted() 按定义返回一个新列表。如果需要匹配输入类型,则可以将返回的对象强制转换为新类型。如果尝试将结果列表强制转换回集合,结果将是无序的,因为集合是无序的,如下:

>>> numbers_tuple = (6, 9, 3, 1)
>>> numbers_set = {5, 5, 10, 1, 0}
>>> numbers_tuple_sorted = sorted(numbers_tuple)
>>> numbers_set_sorted = sorted(numbers_set)
>>> numbers_tuple_sorted
[1, 3, 6, 9]
>>> numbers_set_sorted
[0, 1, 5, 10]
>>> tuple(numbers_tuple_sorted)
(1, 3, 6, 9)
>>> set(numbers_set_sorted)
{0, 1, 10, 5}

**2. 排序字符串型数据 **
字符串类型与其他可迭代对象类似,如列表和元组。下面的示例显示了 sorted() 如何将传递给它的字符串进行遍历,并在输出中对每个字符进行排序:

>>> string_number_value = '34521'
>>> string_value = 'I like to sort'
>>> sorted_string_number = sorted(string_number_value)
>>> sorted_string = sorted(string_value)
>>> sorted_string_number
['1', '2', '3', '4', '5']
>>> sorted_string
[' ', ' ', ' ', 'I', 'e', 'i', 'k', 'l', 'o', 'o', 'r', 's', 't', 't']

sorted() 将字符串视为列表并遍历每个元素。在字符串中,每个元素表示字符串中的一个字符,sorted 会以相同的方式处理一个字符串,对每个字符进行排序,包括空格。 .

我们通过使用 split()可以改变输出是单个字符的结果,以空格为边界将原始字符串拆分成几个单词,再通过.join() 将几个单词重新组合在一起成为新的字符串,具体如下:

>>> string_value = 'I like to sort'
>>> sorted_string = sorted(string_value.split())
>>> sorted_string
['I', 'like', 'sort', 'to']
>>> ' '.join(sorted_string)
'I like sort to'