Python可迭代对象排序:深入排序算法与定制排序

99a119fd55cf0be2366af0dd58b77b56.jpeg

更多Python学习内容:ipengtao.com

排序在计算机科学中是一项基础而关键的操作,而Python提供了强大的排序工具来满足不同场景下的排序需求。本文将深入探讨Python中对可迭代对象进行排序的方法,涵盖基础排序算法、sorted函数的应用、以及定制排序规则和实际应用场景。

基础排序算法

首先,介绍Python中常用的排序算法,包括冒泡排序、插入排序、选择排序等。

冒泡排序

def bubble_sort(arr):n = len(arr)for i in range(n - 1):for j in range(0, n - i - 1):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]# 示例
numbers = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(numbers)
print("冒泡排序结果:", numbers)

插入排序

def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = key# 示例
numbers = [64, 34, 25, 12, 22, 11, 90]
insertion_sort(numbers)
print("插入排序结果:", numbers)

选择排序

def selection_sort(arr):for i in range(len(arr)):min_index = ifor j in range(i + 1, len(arr)):if arr[j] < arr[min_index]:min_index = jarr[i], arr[min_index] = arr[min_index], arr[i]# 示例
numbers = [64, 34, 25, 12, 22, 11, 90]
selection_sort(numbers)
print("选择排序结果:", numbers)

sorted函数的应用

Python的内置函数sorted提供了一种简便而高效的排序方式。

对数字列表排序

numbers = [64, 34, 25, 12, 22, 11, 90]
sorted_numbers = sorted(numbers)
print("排序后的数字列表:", sorted_numbers)

对字符串列表排序

fruits = ["apple", "banana", "cherry", "date", "elderberry"]
sorted_fruits = sorted(fruits, key=len)
print("按字符串长度排序后的水果列表:", sorted_fruits)

定制排序规则

在实际应用中,经常会遇到需要基于复杂规则进行排序的情况。学习如何使用key函数来指定排序规则,以及如何利用lambda表达式和函数对象实现更灵活的定制排序。

对复杂对象进行定制排序

class Student:def __init__(self, name, age, grade):self.name = nameself.age = ageself.grade = gradestudents = [Student("Alice", 21, 85),Student("Bob", 20, 90),Student("Charlie", 22, 80)
]sorted_students = sorted(students, key=lambda x: x.grade, reverse=True)
print("按成绩降序排序后的学生列表:", [student.name for student in sorted_students])

多级排序

class Product:def __init__(self, name, price, rating):self.name = nameself.price = priceself.rating = ratingproducts = [Product("Laptop", 1200, 4.5),Product("Mouse", 20, 4.2),Product("Monitor", 300, 4.7)
]# 先按价格升序,再按评分降序排序
sorted_products = sorted(products, key=lambda x: (x.price, -x.rating))
print("按价格升序、评分降序排序后的产品列表:", [product.name for product in sorted_products])

复杂对象的排序

处理包含多个属性的复杂对象是排序中的常见任务。通过示例,将演示如何在排序过程中考虑对象的多个属性,以及如何实现多级排序。

class Student:def __init__(self, name, age, grade):self.name = nameself.age = ageself.grade = gradestudents = [Student("Alice", 21, 85),Student("Bob", 20, 90),Student("Charlie", 22, 80)
]# 按年龄升序,年龄相同时按成绩降序排序
sorted_students = sorted(students, key=lambda x: (x.age, -x.grade))
print("按年龄升序、成绩降序排序后的学生列表:")
for student in sorted_students:print(f"Name: {student.name}, Age: {student.age}, Grade: {student.grade}")

实际应用场景

数据分析中的排序

import pandas as pddata = {"Name": ["Alice", "Bob", "Charlie"],"Age": [25, 22, 30],"Salary": [50000, 60000, 45000]}df = pd.DataFrame(data)
sorted_df = df.sort_values(by=["Salary", "Age"], ascending=[False, True])
print("按工资降序、年龄升序排序后的数据框:")
print(sorted_df)

多个条件的文件排序

import globfiles = glob.glob("*.txt")
sorted_files = sorted(files, key=lambda x: (len(x), x))
print("按文件名长度升序、字典序升序排序后的文件列表:", sorted_files)

总结

在本文中,我们分享了Python中对可迭代对象进行排序的多种方法和应用场景。首先,通过介绍基础排序算法,提供了排序操作的基础知识。随后,通过sorted函数,展示了一种简便而高效的排序工具,覆盖了对基本类型和复杂对象的排序操作。特别是对于复杂对象,演示了如何利用key参数以及多级排序规则实现灵活的排序需求。

通过实际应用场景的探讨,展示了排序在数据分析、文件处理等领域的实际应用。在数据分析中,使用了Pandas库进行列排序,而在文件处理中,展示了如何按照文件名长度和字典序对文件进行排序。这些实际案例帮助读者更好地理解排序在不同领域中的实际应用价值。

综合而言,排序是计算机科学中一个基础而重要的操作,而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下载

774ef72aa6048b477da60d5b8a36cdf1.png

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

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

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

相关文章

gitbook制作电子书

1 引言 GitBook 是一个开源的文档编辑和托管平台&#xff0c;用于创建和维护文档、手册和电子书。它基于 Markdown 和 Git 技术&#xff0c;帮助用户方便地编写、编辑和发布文档。 GitBook 支持将文档输出为多种格式&#xff0c;包括网页、PDF、ePub 等&#xff0c;适用于不同…

【C++初阶】STL详解(八)List的模拟实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

【深度学习笔记】03 微积分与自动微分

03 微积分与自动微分 导数和微分导数解释的可视化偏导数梯度链式法则自动微分非标量变量的反向传播分离计算 导数和微分 假设我们有一个函数 f : R → R f: \mathbb{R} \rightarrow \mathbb{R} f:R→R&#xff0c;其输入和输出都是标量。 如果 f f f的导数存在&#xff0c;这个…

GIT版本控制和常用命令使用介绍

GIT版本控制和常用命令使用介绍 1. 版本控制1.1 历史背景1.2 什么是版本控制1.3 常见版本控制工具1.4 版本控制的分类 2 Git介绍2.1 Git 工作流程2.2 基本概念2.3 文件的四种状态2.4 忽略文件2.5 Git命令2.5.1 查看本地git配置命令2.5.2 远程库信息查看命令2.5.3 分支交互命令2…

MybatisPlus—自定义ID生成器

提示 自 3.3.0 开始,默认使用雪花算法UUID(不含中划线) 方法主键生成策略主键类型说明nextIdASSIGN_ID&#xff0c;ID_WORKER&#xff0c;ID_WORKER_STRLong,Integer,String支持自动转换为 String 类型&#xff0c;但数值类型不支持自动转换&#xff0c;需精准匹配&…

WorkPlus即时通讯软件,以自主安全为底座,连接工作的一切

在当今竞争激烈的商业环境中&#xff0c;中大型企业对于移动办公平台的需求越来越迫切。在众多可选的平台中&#xff0c;WorkPlus凭借其高性价比和针对中大型企业的特色功能&#xff0c;成为了许多企业的首选。本文将为各位读者深度解析WorkPlus私有化部署的优势&#xff0c;带…

用static修饰的Java类

static修饰Java类的时候&#xff0c;只能修饰成员类&#xff0c;不能修饰其它的类&#xff0c;例如&#xff0c;不能修饰局部类、匿名类。从一个static的嵌套类不能访问外层类的类型变量、实例变量、局部变量、形式参数、异常参数、实例方法。 例如&#xff0c;下面的定义了一…

tensorflow和pytorch的联系与区别

TensorFlow和PyTorch是两个流行的深度学习框架&#xff0c;它们在很多方面都有相似之处&#xff0c;因为它们都旨在解决相同的问题&#xff0c;即构建和训练神经网络。 以下是它们之间的一些联系&#xff1a; 1.深度学习框架&#xff1a; TensorFlow和PyTorch都是开源的深度学…

学习.NET验证模块FluentValidation的基本用法(续2:其它常见用法)

FluentValidation模块支持调用When和Unless函数设置验证规则的执行条件&#xff0c;其中when函数设置的是满足条件时执行&#xff0c;而Unless函数则是满足条件时不执行&#xff0c;这两个函数的使用示例如及效果如下所示&#xff1a; public AppInfoalidator() {RuleFor(x>…

Mysql 解决Invalid default value for ‘created_at‘

在mysql版本 8.0 和 5.* 之间数据互导的过程中&#xff0c;老是会出现各种错误&#xff0c;比如 这个created_at 一定要有一个默认值&#xff0c; 但是我加了 default null 还是会报错&#xff0c;于是对照了其他的DDL 发现&#xff0c;需要再加 null default null 才行&#…

Kubernetes异常排查方式

集群信息&#xff1a; 1. 显示 Kubernetes 版本&#xff1a;kubectl version 2. 显示集群信息&#xff1a;kubectl cluster-info 3. 列出集群中的所有节点&#xff1a;kubectl get nodes 4. 查看一个具体的节点详情&#xff1a;kubectl describe node <node-name> 5. 列…

从0开始学习JavaScript--JavaScript事件:响应与交互

JavaScript的事件处理是Web开发中至关重要的一部分&#xff0c;通过事件&#xff0c;能够实现用户与页面的互动&#xff0c;使得网页更加生动和交互性。本文将深入探讨JavaScript事件的各个方面&#xff0c;包括事件的基本概念、事件类型、事件对象、事件冒泡与捕获、事件委托、…

如何看待 2023 OPPO 开发者大会?潘塔纳尔进展如何?AndesGPT 有哪些亮点?

在2023年11月16日举行的OPPO开发者大会&#xff08;ODC23&#xff09;上&#xff0c;OPPO带来了全新ColorOS 14、全新互联网服务生态以及健康服务进展&#xff0c;这些新动态中有许多值得关注的地方。 1、全新ColorOS 14&#xff1a; 效率提升&#xff1a;ColorOS 14通过一系列…

使用多个域名存储网站资源更有效

1.cdn缓存更加方便 ​ cdn是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容均发、调度等功能模块&#xff0c;让用户就近获取所需要的内容&#xff0c;降低网络拥堵&#xff0c;提高用户访问速度和命中…

29 - 装饰器模式:如何优化电商系统中复杂的商品价格策略?

开始今天的学习之前&#xff0c;我想先请你思考一个问题。假设现在有这样一个需求&#xff0c;让你设计一个装修功能&#xff0c;用户可以动态选择不同的装修功能来装饰自己的房子。例如&#xff0c;水电装修、天花板以及粉刷墙等属于基本功能&#xff0c;而设计窗帘装饰窗户、…

学习grdecl文件格式

最近在学习grdecl文件格式&#xff0c;文档不多。查找资料发现&#xff0c;这个格式的文件是由斯伦贝谢公司的ECLIPSE专业软件生成的。 搜到一些文档&#xff0c;都是2010年之前的&#xff0c;似乎有些用处。文档也交代了这个文件格式分为二进制和文本格式。找到了一个库libecl…

console输出并写入

搞了好久搞出来的代码 //用两种代码 define保留 只显示时间 不显示年月 【成功】 #include <iostream> #include <fstream> #include <chrono> #include <ctime> #include <cstdarg>#define LOG_TO_CONSOLE_AND_FILE_WITH_DATE //#define LOG_T…

虚拟机可ping树莓派树莓派无法ping虚拟机 的解决办法

问题描述 在学习交叉编译的过程中&#xff0c;发现了树莓派无法ping通虚拟机的问题。所以我尝试了各种ping&#xff0c;发现&#xff1a; 虚拟机可以ping通树莓派和主机树莓派可以ping通主机主机可以ping通树莓派和虚拟机唯独树莓派没法ping通虚拟机 尝试各种方法后找到一种…

Qt手写ListView

创建视图&#xff1a; QHBoxLayout* pHLay new QHBoxLayout(this);m_pLeftTree new QTreeView(this);m_pLeftTree->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑m_pLeftTree->setFixedWidth(300);创建模型和模型项&#xff1a; m_pLeftTree…

车载通信架构 —— 传统车内通信网络FlexRay(较高速度高容错、较灵活拓扑结构)

车载通信架构 —— 传统车内通信网络FlexRay(较高速度高容错、较灵活拓扑结构) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,…