Python列表的排序方法:从基础到高级

news2024/11/27 12:50:17

2b5a6eb1f6d6179e6276f3136d9f0f5a.jpeg

更多Python学习内容:ipengtao.com

大家好,我是彭涛,今天为大家分享 Python列表的排序方法:从基础到高级,全文3400字,阅读大约10分钟。

在Python中,列表是一种常用的数据结构,而对列表进行排序则是开发过程中常见的任务之一。本文将深入探讨Python中列表排序的方法,从基础的排序函数到高级的定制排序策略,为大家提供全面的了解和实际应用示例。

1. 基础排序方法

1.1 使用 sorted() 函数

Python提供了内置的sorted()函数,用于对可迭代对象进行排序。该函数返回一个新的已排序列表,不会修改原始列表。

numbers = [4, 2, 8, 1, 6]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # 输出:[1, 2, 4, 6, 8]

1.2 使用 sort() 方法

列表对象本身也提供了sort()方法,可以直接对列表进行排序。与sorted()不同,sort()会直接修改原始列表。

fruits = ['apple', 'orange', 'banana', 'grape']
fruits.sort()
print(fruits)  # 输出:['apple', 'banana', 'grape', 'orange']

2. 高级排序方法

2.1 自定义排序规则

可以使用key参数来指定排序时的自定义规则。例如,按字符串长度进行排序:

words = ['python', 'is', 'awesome', 'language']
sorted_words = sorted(words, key=len)
print(sorted_words)  # 输出:['is', 'python', 'language', 'awesome']

2.2 逆序排序

通过reverse参数,可以轻松实现逆序排序。

numbers = [4, 2, 8, 1, 6]
sorted_desc = sorted(numbers, reverse=True)
print(sorted_desc)  # 输出:[8, 6, 4, 2, 1]

2.3 利用Lambda表达式定制排序

使用key参数时,还可以结合Lambda表达式定义更复杂的排序规则。

students = [('Alice', 25), ('Bob', 20), ('Charlie', 30)]
sorted_students = sorted(students, key=lambda x: x[1])
print(sorted_students)  
# 输出:[('Bob', 20), ('Alice', 25), ('Charlie', 30)]

3. 稳定排序与不稳定排序

在Python中,排序算法是稳定的,即对于具有相同排序键的元素,它们在排序后的相对位置保持不变。

pairs = [(1, 2), (5, 2), (1, 3), (5, 1)]
sorted_pairs = sorted(pairs, key=lambda x: x[0])
print(sorted_pairs)  
# 输出:[(1, 2), (1, 3), (5, 2), (5, 1)]

4. 高级排序算法

除了基础和高级排序方法外,Python还提供了一些高级排序算法的实现,如归并排序和快速排序。这些算法通常在处理大规模数据时表现更为出色。

4.1 归并排序

归并排序是一种分治算法,它将列表分成较小的部分,分别排序后再合并。Python中可以使用sorted()函数的key参数结合merge_sort()函数实现归并排序。

def merge_sort(lst):
    if len(lst) <= 1:
        return lst
    
    mid = len(lst) // 2
    left = merge_sort(lst[:mid])
    right = merge_sort(lst[mid:])
    
    return merge(left, right)

def merge(left, right):
    result = []
    i = j = 0
    
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    
    result.extend(left[i:])
    result.extend(right[j:])
    return result

numbers = [4, 2, 8, 1, 6]
sorted_numbers = merge_sort(numbers)
print(sorted_numbers)  # 输出:[1, 2, 4, 6, 8]

4.2 快速排序

快速排序是一种常见且高效的排序算法,它通过选取一个基准元素,将数组分成两部分,小于基准的放左边,大于基准的放右边。然后递归地对左右两部分进行排序。

def quick_sort(lst):
    if len(lst) <= 1:
        return lst
    
    pivot = lst[len(lst) // 2]
    left = [x for x in lst if x < pivot]
    middle = [x for x in lst if x == pivot]
    right = [x for x in lst if x > pivot]
    
    return quick_sort(left) + middle + quick_sort(right)

numbers = [4, 2, 8, 1, 6]
sorted_numbers = quick_sort(numbers)
print(sorted_numbers)  # 输出:[1, 2, 4, 6, 8]

5. 使用 itemgetterattrgetter

Python的operator模块提供了itemgetterattrgetter函数,用于按照索引或对象属性对列表进行排序。

from operator import itemgetter, attrgetter

students = [('Alice', 25, 'A'), ('Bob', 20, 'B'), ('Charlie', 30, 'C')]
sorted_students_by_age = sorted(students, key=itemgetter(1))
sorted_students_by_grade = sorted(students, key=itemgetter(2))
print(sorted_students_by_age)  
# 输出:[('Bob', 20, 'B'), ('Alice', 25, 'A'), ('Charlie', 30, 'C')]
print(sorted_students_by_grade)  
# 输出:[('Alice', 25, 'A'), ('Bob', 20, 'B'), ('Charlie', 30, 'C')]

总结

本文深入剖析了Python中列表排序的各种方法,从基础到高级、从内置函数到算法实现,提供了全面而深刻的了解。在基础排序方法中,sorted()函数和sort()方法展现了简单而直观的排序方式,适用于大多数场景。高级排序方法中,自定义排序规则、逆序排序、Lambda表达式以及稳定排序与不稳定排序等技巧为开发者提供了更多选择,满足了不同排序需求。

文章进一步介绍了高级排序算法,包括归并排序和快速排序,它们在处理大规模数据时展现出色的性能。通过示例代码,可以更好地理解和运用这些高效的算法。另外,通过itemgetterattrgetter函数,展示了如何基于索引和对象属性进行排序,提高了对复杂数据结构的处理能力。

在实际应用中,选择合适的排序方法取决于数据的规模、排序需求和性能要求。掌握这些排序技巧,不仅可以提高代码的可读性和可维护性,还能有效解决不同场景下的排序难题。因此,深入学习和灵活运用这些排序方法将使Python开发者在日常工作中更加得心应手。通过本文的学习,将建立起对Python列表排序全貌的清晰认识,为自己的编程技能提升打下坚实基础。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

  100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

10bb4627fbbd029cd638ef7c5f8c42be.png

点击“阅读原文”,获取更多学习内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1300695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排序算法之六:快速排序(非递归)

快速排序是非常适合使用递归的&#xff0c;但是同时我们也要掌握非递归的算法 因为操作系统的栈空间很小&#xff0c;如果递归的深度太深&#xff0c;容易造成栈溢出 递归改非递归一般有两种改法&#xff1a; 改循环借助栈&#xff08;数据结构&#xff09; 图示算法 不是…

P1317 低洼地题解

题目 一组数&#xff0c;分别表示地平线的高度变化。高度值为整数&#xff0c;相邻高度用直线连接。找出并统计有多少个可能积水的低洼地&#xff1f; 如图&#xff1a;地高变化为 [0,1,0,2,1,2,0,0,2,0]。 输入输出格式 输入格式 两行&#xff0c;第一行n, 表示有n个数。第…

【Unity动画】什么是任意状态(Any state)

&#xff08;Any state&#xff09;可以从某个状态A直接切换到另一个状态 B\C\D\E\F 比如A到C的过渡&#xff0c;直接设置从Any state 到C的过渡线触发参数即可。而不需要让A到C直接在连接&#xff0c;同样&#xff0c;B到C之间也无需直接链接。 这样设计是在每一个动画之间都…

5_CSS三大特性盒子模型

第5章-盒子模型【比屋教育】 本课目标&#xff08;Objective&#xff09; 掌握CSS三大特性理解什么是盒子模型掌握内边距padding的用法掌握外边距margin的用法 1. CSS的层叠&#xff0c;继承&#xff0c;优先级 1.1 CSS层叠 层叠&#xff1a;是指多个CSS样式叠加到同一个元…

Java 类加载器和双亲委派机制原理剖析

目录 一、类加载器(ClassLoader)二、四种类加载器之间的关系三、双亲委派机制3.1、为什么要设计双亲委派机制3.2、类加载器loadClass(String name) 源码解析3.3、打破双亲委派机制 一、类加载器(ClassLoader) JVM的类加载机制是按需加载的模式运行的&#xff0c;也就是代表着&a…

万户 ezOFFICE convertFile 文件读取漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

Linux环境下socket本地通信

最近项目有用到了socket本地通信&#xff0c;故复习一下。之前都是基于本地虚拟机的ip地址通信的&#xff0c;现在项目&#xff0c;Linux单板上面有2个进程需要通信&#xff0c;故用到了本地socket通信&#xff0c;主要其实就是用了sockfd,文件描述符&#xff0c;也叫句柄。 服…

MySQL概述-安装与启动

数据库相关概念 MySQL数据库 下载地址 MySQL :: Download MySQL Installer (Archived Versions) 启动方法 启动密令&#xff1a;net start mysql80 停止密令&#xff1a;net stop mysql80 客户端链接方法 注意用系统自带的命令行工具执行指令需要设置环境在高级系统设置中…

Vue 创建虚拟DOM元素的几种方式和实际应用。

目录 创建虚拟DOM元素的方式 创建一个简单的元素&#xff1a; 创建一个带有属性的元素&#xff1a; 创建一个带有子元素的元素&#xff1a; 创建一个带有事件监听器的元素&#xff1a; 创建一个Vue组件 创建一个带Props的组件 创建一个带Slot的组件 实际应用 创建虚…

Python源码17:使用海龟画图turtle画五星红旗

turtle模块是一个Python的标准库之一&#xff0c;它提供了一个基于Turtle graphics的绘图库。Turtle graphics是一种流行的绘图方式&#xff0c;它通过控制一个小海龟在屏幕上移动来绘制图形。 turtle模块可以让您轻松地创建和控制海龟图形&#xff0c;从而帮助您学习Python编…

SpringSecurity6 | 登录成功后的JSON处理

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

Gilisoft Video Editor——迈出剪辑的第一步

今天博主分享的是又一款剪辑软件——视频剪辑手&#xff08;GiliSoft Video Editor&#xff09;&#xff0c;对剪辑视频感兴趣的小伙伴千万不要错过。这是一款专门用于视频剪辑的软件&#xff0c;功能比较简单&#xff0c;相比于专业的pr是比不了的&#xff0c;但是制作一些简单…

内存映射机制

什么是内存映射 Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来&#xff0c;以初始化这个虚拟区域的内如&#xff0c;这个过程称为内存映射。 代码示例&#xff1a; /******************************************************************** > File Name: mmap…

如何查询川菜食材配料的API接口

在当今的美食文化中&#xff0c;菜谱不只是一张简单的食谱&#xff0c;更是了解美食文化和饮食知识的重要途径。然而&#xff0c;若没有准确的食材配料&#xff0c;烹制出的每道菜品都将难以达到完美的味道。因此&#xff0c;为了更好地满足人们对于菜谱和食谱的需求&#xff0…

Gitzip插件【Github免翻下载】

今天给大家推荐一个github下载的插件&#xff0c;平常大家下载应该无外乎就是以下两种&#xff1a; Download zip利用git clone 但是这两种各有各的弊端&#xff0c;前者一般需要科学上网才可以&#xff0c;后者下载不稳定经常中途断掉。 今天给推荐一个款浏览器插件-Gitzip.大…

单调栈结构

单调栈 单调栈是一种特殊设计的栈结构&#xff0c;为了解决如下的问题&#xff1a; 给定一个可能含有重复数值的 arr[]&#xff0c;i位置的数一定存在如下两种信息&#xff1a; arr[i]的左侧离 i 最近并且小于&#xff08;或者大于&#xff09;arr[i] 的数在哪&#xff1f;arr…

边缘AI行业报告:发展趋势、相关机遇、产业链及相关公司深度梳理

今天分享的AI系列深度研究报告&#xff1a;《边缘AI行业报告&#xff1a;发展趋势、相关机遇、产业链及相关公司深度梳理》。 &#xff08;报告出品方&#xff1a;慧 博 智 能 投 研&#xff09; 报告共计&#xff1a;31页 边缘计算及边缘 AI 概述 1.边缘AI 边缘 AI(本文指…

第四节JavaScript 条件语句、循环语句、break与continue语句

一、JavaScript条件语句 在通常的代码中&#xff0c;我们有一些需要决定执行不同动作&#xff0c;这就可以在代码中使用条件语句来完成。 下面是我们常使用的条件语句&#xff1a; if语句&#xff1a;只有当指定条件是true时&#xff0c;执行条件内代码。if…else语句&#…

代码序随想录二刷 |二叉树 | 二叉树的层序遍历II

代码序随想录二刷 &#xff5c;二叉树 &#xff5c; 二叉树的层序遍历II 题目描述解题思路代码实现 题目描述 107.二叉树的层序遍历II 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0…

【Unity动画】Avatar Mask

创建 Avatar Mask可以设置那一部分骨骼运动和不运动 然后放在状态机里面的层中来混合 【后续完善】