当前位置: 首页 > news >正文

4个Python推导式相关的开发技巧

对于数据科学,Python通常被广泛地用于进行数据的处理和转换,它提供了强大的数据结构处理的函数,使数据处理更加灵活,这里说的“灵活性”是什么意思?

这意味着在Python中总是有多种方法来实现相同的结果,我们总是有不同的方法并且需要从中选择易于使用、省时并能更好控制的方法。

要掌握所有的这些方法是不可能的。所以这里列出了在处理任何类型的数据时应该知道的4个Python技巧。

列表推导式List Comprehension是创建列表的一种优雅且最符合python语言的方法。与for循环和if语句相比,列表推导式在基于现有列表的值创建新列表时语法要短得多。因此,让我们看看该特性如何获得列表的副本。

使用列表推导式复制一个列表

有时需要创建现有列表的副本。最简单的答案是.copy(),它允许您将一个列表的内容复制到另一个(新)列表。

例如,一个由整数组成的列表original_list。

 original_list = [10,11,20,22,30,34]

可以简单地使用.copy()方法复制此列表。

 duplicated_list = original_list.copy()

列表推导式可以得到完全相同的输出。复制列表是理解列表推导式的最佳案例。

看看下面这段代码。

 duplicated_list = [item for item in original_list]

这里并不是说复制列表使用列表推导式更好,而是说对于介绍列表推导式的工作方式,这个案例是最好的。

接下来,让我们看看对列表的每个元素执行数学运算时,列表推导式如何使工作变得简单。

列表中的元素相乘

最简单或直接的乘法方法是使用乘法运算符,即*

例如,想用一个标量(即数字5)乘以列表中的每一项。这里肯定不能使用original_list*5,因为它将创建列表的5个副本。

在这个场景中,最好的答案是列表推导式,如下所示。

 original_list = [10,11,20,22,30,34]
 multiplied_list = [item*5 for item in original_list]
 
 # Output
 [50, 55, 100, 110, 150, 170]

这里的操作并不局限乘以一个数字。可以对原始列表的每个元素执行复杂的操作。

例如,假设想计算每一项的平方根的立方,可以在一行中解决它。

 multiplied_list = [math.sqrt(item)**3 for item in original_list]
 
 # Output
 [31.6227766016838,
  36.4828726939094,
  89.4427190999916,
  103.18914671611546,
  164.31676725154983,
  198.25236442474025]

用于计算数字平方根的函数sqrt属于库math,因此在本例中需要在使用它之前导入它。

与上面所示的内置函数类似,还可以在列表的每个元素上使用用户定义的函数。

例如如下所示的简单函数。

 def simple_function(item):
     item1 = item*10
     item2 = item*11
     return math.sqrt(item1**2 + item2**2)

可以对列表的每一项应用这个用户定义的函数。

 multiplied_list = [simple_function(item) for item in original_list]
 
 # Output
 [148.66068747318505,
  163.52675622050356,
  297.3213749463701,
  327.0535124410071,
  445.9820624195552,
  505.4463374088292]

列表推导式在实际场景中甚至更有用。通常在分析任务中需要从列表中删除某种类型的元素,例如消0护着nan元素。列表推导式是完成这些任务的完美工具。

删除列表中的元素

根据特定条件筛选数据是选择所需数据集的常见任务之一,同样的逻辑也用于列表推导式中。

假设你有下面提到的数字列表。

 original_list = [10, 22, -43, 0, 34, -11, -12, -0.1, 1]

你想要从这个列表中只保留正值。因此,从逻辑上讲,您希望只保留那些对条件项> 0求值为TRUE的项。

 new_list = [item for item in original_list if item > 0]
 
 # Output
 [10, 22, 34, 1]

if子句用来删除负值。可以使用if子句应用任何条件来从列表中删除任何项。

例如,当想删除所有平方小于200的项时需要做的就是在列表综合中提到条件项**2 > 200,如下所示。

 new_list = [item for item in original_list if item**2 > 200]
 
 # Output
 [22, -43, 34]

在处理真实的数据集时,过滤列表项的条件可能要复杂得多,这种方法既快又易于理解。

使用dict()将两个列表转换为字典键值对

有时需要从两个列表中的值创建字典。你可以使用字典推导式(dictionary**comprehension) ,而不是一个一个地输入,这是创建字典的一种优雅而简洁的方法!

它的工作原理与列表推导式完全相似,唯一的区别是——创建一个列表推导式时,你将所有内容都包含在方括号中,例如[],而在字典推导式中,你将所有内容都包含在花括号中,例如{}。

假设有两个列表—字段和详细信息—如下所示。

 fields = [‘name’, ‘country’, ‘age’, ‘gender’]
 details = [‘pablo’, ‘Mexico’, 30, ‘Male’]

一个简单的方法是使用像这样的字典推导式-

 new_dict = {key: value for key, value in zip(fields, details)}
 
 # Output
 {'name': 'pablo', 'country': 'Mexico', 'age': 30, 'gender': 'Male'}

这里需要理解的重要是函数zip是如何工作的。

在Python中,zip函数接受可迭代对象,如字符串、列表或字典作为输入,返回它们聚合为元组。

因此,在本例中zip已经从列表fields和details中形成了每个项的对。当字典推导式中使用key: value时,只需将此元组解包为单独的键-值对。

当使用Python中内置的dict()构造函数(用于创建字典)时,这个过程甚至会变得更快,因为dict()比字典推导式至少快1.3倍!

所以我们需要将此构造函数与zip()函数一起使用,它的语法要简单得多——dict(zip(fields,details))

总结

正如我一开始提到的,Python非常灵活,因为有多种方法可以实现相同的结果。根据任务的复杂程度需要选择最好的方法来实现它。

我希望这篇文章能对你有用。如果有任何其他方法可以做到我在本文中提到的同样的事情,请告诉我。

https://avoid.overfit.cn/post/7198f28db4104e13819d38da4f3bd99b

作者:Suraj Gurav

相关文章:

  • 计算机网络——媒体接入控制
  • 一起来学反射
  • 一文了解Java序列化与反序列化
  • 【.Net实用方法总结】 整理并总结System.Data中DataColumn类及其方法介绍
  • ffmpeg、ffplay、ffprobe 常用命令详解(音视频必备)
  • [SpringMVC] SpringMVC入门
  • [ 数据结构 - C++]红黑树RBTree
  • 【闲笔杂谈】ArrayList的构造与扩容机制
  • Flink系列之:基于Flink CDC2.0实现海量数据的实时同步和转换
  • [架构之路-21]:目标系统 - 软件系统 - 计算机系统架构、计算机指令系统、结构化程序与分层编程。
  • acwing算法基础模版分析
  • 数据库-MySQL-基础(7)函数
  • MySQL入门学习笔记(下)
  • 15.4 - 分类树法
  • python容器
  • CSS 专业技巧
  • DOM的那些事
  • Hibernate【inverse和cascade属性】知识要点
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java精华积累:初学者都应该搞懂的问题
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 产品三维模型在线预览
  • 记一次和乔布斯合作最难忘的经历
  • 前端学习笔记之观察者模式
  • 线性表及其算法(java实现)
  • 一、python与pycharm的安装
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • PostgreSQL之连接数修改
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (2)(2.10) LTM telemetry
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (轉貼) UML中文FAQ (OO) (UML)
  • .gitignore文件设置了忽略但不生效
  • .jks文件(JAVA KeyStore)
  • .net 调用海康SDK以及常见的坑解释
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • @property @synthesize @dynamic 及相关属性作用探究
  • @Transactional事务注解内含乾坤?
  • [<死锁专题>]
  • [AIGC] 如何建立和优化你的工作流?
  • [ARC066F]Contest with Drinks Hard
  • [C/C++]数据结构----顺序表的实现(增删查改)