按 Python 列表元素长度排序

2024 年 8 月 29 日 | 阅读 6 分钟

目标是根据元素的长度对列表进行排序。另外,假设列表只包含一种类型的元素。

例如

说明: 输入列表是字符串列表:["Javatpoint", "Google", "Yahoo", "Microsoft"]。我们可以看到这些字符串的长度分别为 10、6、5 和 9。因此,根据元素长度排序后的列表将是 ["Yahoo", "Google", "Microsoft", "Javatpoint"],因为 "Yahoo" 的长度最短(5),其次是 "Google"(6),然后是 "Microsoft"(9),最后是 "Javatpoint"(10)。

说明: 输入列表是字符串列表的列表:[["Arun", "Rohan", "Vikesh"], ["Java", "Python"], ["Kavi"], ["Suraj", "Kiran"]]。在这里,我们需要根据子列表的长度对列表进行排序。每个子列表的长度分别为 3、2、1 和 2。因此,排序后的列表将是 [["Kavi"], ["Java", "Python"], ["Suraj", "Kiran"], ["Arun", "Rohan", "Vikesh"]]。

注意:在平局的情况下,当两个或多个元素的长度相同时,输入列表中出现的元素应首先出现在输出列表中。例如,在第二个示例中,子列表 ["Suraj", ["Kiran"]] 和 ["Arun", "Rohan", "Vikesh"] 的长度都为 2,但 ["Suraj", ["Kiran"]] 在输入列表中出现在 ["Arun", "Rohan", "Vikesh"] 之前,因此它在输出列表中也出现在其前面。

有多种方法可以按元素长度对 Python 列表进行排序。可以自己编写算法来对列表进行排序。在 Python 中,我们有内置函数,如 sort() 和 sorted(),带有 key 参数,我们可以使用它来根据元素的长度对列表进行排序。

方法 1 - 使用 sort() 函数

在此方法中,我们将使用 sort 函数对列表进行排序,key 参数将是 'len' 函数。

代码

输出

Input list 1 = ['Javatpoint', 'Google', 'Yahoo', 'Microsoft']
Input list 2 = [['Arun', 'Rohan', 'Vikesh'], ['Java', 'Python'], ['Kavi'], ['Suraj', 'Kiran']]

Sorted list 1 = ['Yahoo', 'Google', 'Microsoft', 'Javatpoint']
Sorted list 2 = [['Kavi'], ['Java', 'Python'], ['Suraj', 'Kiran'], ['Arun', 'Rohan', 'Vikesh']]

说明

在上面的程序中,我们首先声明了两个列表:一个字符串列表和一个子列表列表。然后我们使用 sort 函数对列表进行排序,并将 len 函数作为 key 参数传递。

对于列表中的每个元素,len 函数返回其长度,列表根据元素的长度进行排序。最后,我们打印排序后的列表。

时间复杂度 = O(n): 排序算法的最坏时间复杂度为 O(n logn)。

空间复杂度 = O(1): 不需要额外的空间。列表在内部进行排序。

方法 2 - 使用 Sorted() 函数

在此方法中,我们将使用 sorted 函数对列表进行排序。sorted 函数的第一个参数是列表本身,key 参数是 len 函数。

代码

输出

Input list 1 = ['Javatpoint', 'Google', 'Yahoo', 'Microsoft']
Input list 2 = [['Arun', 'Rohan', 'Vikesh'], ['Java', 'Python'], ['Kavi'], ['Suraj', 'Kiran']]

Sorted list 1 = ['Yahoo', 'Google', 'Microsoft', 'Javatpoint']
Sorted list 2 = [['Kavi'], ['Java', 'Python'], ['Suraj', 'Kiran'], ['Arun', 'Rohan', 'Vikesh']]

说明

在上面的程序中,我们声明了两个列表:一个字符串列表和一个子列表列表。然后我们使用 sorted() 函数对列表进行排序。

sorted 函数的第一个参数是要排序的列表,key 参数是 len 函数。

对于列表中的每个元素,len 函数返回其长度,列表根据元素的长度进行排序。

方法 1 和方法 2 之间的唯一区别是,在方法 1 中,列表在内部进行排序。在方法 2 中,会创建新的已排序列表,而原始列表不受影响。

时间复杂度 = O(n): 排序算法的最坏时间复杂度为 O(n logn)。

空间复杂度 = O(n): 需要额外的空间来存储排序后的列表。排序后列表的大小取决于输入列表的长度,使得空间复杂度等于 O(n)。

方法 3 - 使用 numpy() 库

在此方法中,我们将使用 numpy 库和 argsort 方法根据元素的长度对列表进行排序。

代码

输出

Input list = ['Javatpoint', 'Google', 'Yahoo', 'Microsoft']

Sorted list = ['Yahoo', 'Google', 'Microsoft', 'Javatpoint']

说明

首先,我们将 numpy 库导入并别名为 np。我们使用 np.array() 函数将列表转换为 numpy 数组,并将结果存储在 my_array 中。然后我们使用 np.argsort() 对数组根据其元素长度进行排序,该函数返回将用于排序数组的索引。我们已将 list(map(len, my_array)) 作为排序键传入,它返回一个包含数组中字符串长度的列表。

然后我们使用切片语法 (my_array[indices]) 将排序索引应用于原始数组,并将结果存储在 sorted_array 中。最后,我们使用 list() 构造函数将排序后的数组转换回列表,并将其存储在 sorted_list 中。

最后,我们将结果打印到控制台。

时间复杂度 = O(n logn): np.argsort() 函数的最坏情况时间复杂度为 O(n logn),list(map(len, my_array) 操作的时间复杂度为 O(n),因为它只遍历数组的元素一次以计算其元素的长度。

空间复杂度 = O(n): 我们创建了一个大小为 n 的 numpy 数组。此外,list(map(len, my_array) 创建了一个大小为 n 的列表,使得程序的空间复杂度等于 O(n)。

注意:在此方法中,我们使用了 numpy 库并将列表转换为 numpy 数组,这并不是一种有效的对列表进行排序的方法。我们可以直接使用内置的 sort() 函数来对列表进行排序,并将 len 函数作为 key 参数传入,如前一种方法所示。