详解python排序的5种高级用法

来源:投稿 作者:Fairy

编辑:学姐

排序是编程中常用的操作之一。Python提供了多种排序方法,可以适用于不同的排序需求。

那么,今天我们将介绍Python中常用的 5 种列表排序方法

「1.使用sorted()函数和lambda表达式」

使用sorted()函数和lambda表达式进行自定义排序:可以使用sorted()函数和lambda表达式来根据需要对列表、元组或字典等数据结构进行自定义排序。

# 对元组列表按照第一个元素升序排序
my_list = [(2, 'b'), (3, 'c'), (1, 'a')]
sorted_list = sorted(my_list, key=lambda x: x[0])
print(sorted_list) # 输出 [(1, 'a'), (2, 'b'), (3, 'c')]

首先,使用 sorted() 函数对 my_list 进行排序,并将排序后的结果赋值给变量 sorted_list。在 sorted() 函数中,使用 key 参数对排序依据进行定义,这里使用 lambda 表达式创建了一个简单的匿名函数,该函数接受一个参数 x,并返回元组中的第一个元素 x[0]。因此,sorted() 函数根据元组的第一个元素进行排序。

最后,打印出排好序的列表 sorted_list,最终结果如下:

「2.使用operator模块」

这里需要先将operator模块导入脚本中,可以使用其中的函数(如itemgetter(),attrgetter())对复杂的数据类型进行排序。

import operator

# 对字典按照值降序排序
my_dict = {'a': 4, 'b': 2, 'c': 7}
sorted_dict = dict(sorted(my_dict.items(), key=operator.itemgetter(1), reverse=True))
print(sorted_dict) # 输出 {'c': 7, 'a': 4, 'b': 2}

首先,使用 items() 方法将字典转换为元组列表,每个元组包含一个键和一个值。然后使用 sorted() 函数对该列表进行排序。key 参数指定排序依据,operator.itemgetter(1) 表示按照元组的第二个元素(即字典的值)进行排序,reverse=True 表示进行降序排序。排序后的结果是一个元组列表,每个元组包含排好序的键值对。

最后,使用 dict() 函数将排好序的元组列表转换回字典格式,并将结果赋值给变量 sorted_dict。打印出 sorted_dict,最终结果如下:

「3.使用heapq模块」

heapq是一个Python内置模块,提供了对堆的基本支持。它可以对可迭代对象进行原地堆排序并返回一个排序后的列表。

import heapq

# 找出列表中前3个最小的数字
my_list = [5, 8, 3, 9, 1, 6, 4]
smallest_numbers = heapq.nsmallest(3, my_list)
print(smallest_numbers) # 输出 [1, 3, 4]

使用 heapq.nsmallest() 函数可以从一个可迭代对象中,快速地找到其中的最小元素,同时可以指定要返回的最小元素个数。该函数接受两个参数:第一个参数是要返回的元素个数(即本例中的 3),第二个参数是一个可迭代对象(即本例中的列表 my_list)。

在本例中,我们将列表 my_list 传递给 heapq.nsmallest() 函数,并请求找出前 3 个最小的数字。smallest_numbers 变量存储了找到的最小数字,结果为 [1, 3, 4]。这些数字是按照升序排列的,符合预期的结果,最终结果如下:

「4.使用functools模块」

在某些情况下,可能需要使用多个条件对数据进行排序。可以使用functools模块中的cmp_to_key()函数来实现这一点。

import functools

# 对元组列表按照第一个元素升序排序,如果第一个元素相同则按照第二个元素降序排序
my_list = [(2, 6), (3, 8), (1, 5), (2, 3)]
sorted_list = sorted(my_list, key=functools.cmp_to_key(lambda x, y: x[0] - y[0] or y[1] - x[1]))
print(sorted_list)

lambda 函数接受两个参数 x 和 y,分别表示要比较的元组。首先,它通过比较两个元组的第一个元素进行排序,即 x[0] - y[0];如果第一个元素相同,则再按照第二个元素降序排列,即 y[1] - x[1]。因为默认情况下 sorted 函数是升序排列,所以在第二个比较时需要对参数位置进行反转。

最后,使用 sorted() 函数对 my_list 进行排序,并将结果存储在 sorted_list 变量中。打印输出 sorted_list ,最终结果如下:

「5.使用numpy模块」

numpy.sort(array)将按升序对数组进行排序。

import numpy as np

# 对数组进行升序排序
my_array = np.array([5, 8, 3, 9, 1, 6, 4])
sorted_array = np.sort(my_array)
print(sorted_array) # 输出 [1 3 4 5 6 8 9]

我们先创建了一个一维数组 my_array,然后调用 np.sort() 函数对该数组进行升序排序。排序结果被存储在 sorted_array 数组中。最后使用 print() 函数打印输出 sorted_array ,最终结果如下:

关注下方《学姐带你玩AI》🚀🚀🚀

回复“python”了解更多学习资料

码字不易,欢迎大家点赞评论收藏!

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python ,有多排序算法可以用来对数据进行排序。下面我将详细解释几常见的排序算法及其实现。 1. 冒泡排序(Bubble Sort): 冒泡排序是一简单的比较排序算法,它重复地比较相邻的元素,并将较大的元素逐步向右移动。具体实现如下: ```python def bubble_sort(arr): n = len(arr) for i in range(n - 1): for j in range(n - 1 - i): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] return arr ``` 2. 插入排序(Insertion Sort): 插入排序是一简单直观的排序算法,它逐步构建有序序列,对于未排序部分的每个元素,将其插入到已排序序列的正确位置。具体实现如下: ```python def insertion_sort(arr): n = len(arr) for i in range(1, n): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr ``` 3. 选择排序(Selection Sort): 选择排序是一简单直观的排序算法,它每次从未排序部分选择最小的元素,并将其放在已排序部分的末尾。具体实现如下: ```python def selection_sort(arr): n = len(arr) for i in range(n - 1): min_idx = i for j in range(i + 1, n): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr ``` 4. 快速排序(Quick Sort): 快速排序是一高效的分治排序算法,通过选择一个基准元素,将序列分割成较小和较大的两个子序列,然后递归地对子序列进行排序。具体实现如下: ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` 这只是其常见的排序算法,每算法都有其适用的场景和性能特点。在实际应用,可以根据数据规模和性能需求选择合适的排序算法。另外,Python 还提供了内置的排序函数 `sorted()` 和列表方法 `sort()` 可以方便地进行排序操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值