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

【Python】列表生成式应用的八重境界

1. 引言

在Python中有非常多且好用的技巧,其中使用最多的是列表生成式,往往可以将复杂的逻辑用简单的语言来实现,本文重点介绍列表生成式应用的八重境界。
闲话少说,我们直接开始吧!

2. Level1: 基础用法

最最简单的列表生成式,举例如下:

a = [1, 2, 3]
b = [n*2 for n in a]
# b = [2, 4, 6]

上述代码实现了对列表中单个元素求平方的操作。

3. Level2: 加入条件语句

其实,我们可以在列表生成式中添加if来获取我们需要的元素,举例如下:

a = [1, 2, 3, 4, 5]
b = [n for n in a if n<4]
# b = [1, 2, 3]

上述代码中,我们添加了一个条件来决定在列表生成式中应该保留哪些元素。这里我们的条件是,如果n<4,则只保留小于4的数。

4. Level3: 加入 enumerate()

我们知道,枚举函数enumerate()可以同时生成元素以及相应的元素的索引。如果我们需要元素的索引以及元素,我们可以在列表生成式中使用函数enumerate()
举例如下:

a = ["apple", "orange", "pear"]
b = [(i,fruit) for i,fruit in enumerate(b)]
# b is [(0,"apple"), (1,"orange"), (2,"pear")]

5. Level4: 加入 zip()

更进一步,我们知道函数zip()可以非常方便地使我们同时遍历2个或多个列表。
在列表生成式中加入函数zip(),样例如下:

a = ["apple", "orange", "pear"]
a2 = ["pie", "juice", "cake"]
b = [i+j for i,j in zip(a, a2)]
# b is ["applepie", "orangejuice", "pearcake"]

6. Level5: 加入三目运算符

三元运算符A if condition else B允许我们根据条件将每个元素转换为其他元素。

在列表生成式中同样可以使用三目运算符,样例如下:

a = [56, 45, 76, 23]
b = [("pass" if n>=50 else "fail") for n in a]
# b is ["pass", "fail", "pass", "fail"]

7. Level6: 嵌套循环

其实,我们当然也可以在列表生成式中使用嵌套循环,我们来看个例子,如下:

a = [10, 20, 30]
a2 = [1, 2, 3]
b = [i+j for i in a for j in a2]
# b is [11, 12, 13, 21, 22, 23, 31, 32, 33]

实质上,上述实现等价代码如下:

newlist = []
for i in a:
    for j in a2:
        newlist.append( i+j )

8. Level7: 嵌套列表生成式

更高级一点,我们可以在列表生成式中嵌套列表生成式,举例如下:

a = [1, 2, 3]
b = [[i for i in range(1, n+1)] for n in a]
# b is [[1], [1, 2], [1, 2, 3]]

9. Level8: 合并上述所有技巧

最后的最后,让我们将上述介绍的几个技巧进行合并,我们来看如下例子:

a = [1, 2, 3, 4, 5]
b = [[xx if xx>yy else yy for xx in range(x) for yy in range(y)] for i,(x,y) in enumerate(zip(a, a[::-1])) if i%2==0]
# [[0, 1, 2, 3, 4], [0, 1, 2, 1, 1, 2, 2, 2, 2], [0, 1, 2, 3, 4]]

上述实现意义不大,我们尝试应用上了上面介绍的所有技巧,但是毕竟代码可读性太大。其主要目的还是为了说明我们可以结合多种技巧,来使我们的列表生成式实现更加强大的功能。

10. 应用栗子

好吧,我们来看个实际的应用例子吧!
假设我们班级上有如下同学信息:

students = [
    ("bob", "m", [67, 89, 60]),
    ("alice", "f", [97, 85, 61]),
    ("cassie", "f", [78, 91, 89]),
    ("tim", "m", [47, 57, 24]),
    ("tom", "m", [91, 79, 72]),
]

上述列表展示了每个学生的姓名、性别和考试成绩,这里假设如果一个学生的平均分数≥ 50,那么这个学生有资格获奖。这里我们需要编写代码,来找到上述列表中有资格获奖的男生。
样例代码如下:

x = [(name, "eligible" if sum(scores)/len(scores) >=50 else "not eligible") for name,gender,scores in students if gender=="m"]
#[('bob', 'eligible'), ('tim', 'not eligible'), ('tom', 'eligible')]

11. 总结

本文重点介绍了理解Python中的列表生成式的八重境界,并给出了相应的代码示例。

您学废了嘛?

相关文章:

  • SOA、ESB、微服务、分布式概念及专业名词阐述
  • IDEA 集成 Github(八)——Git
  • Go程序(Grpc服务)协程数暴涨的原因排查分析
  • Unity新的Input System
  • YOLOv5代码解析(二)
  • kafka系列(一)安装使用及基本原理
  • C# 第七章『I/O数据流』◆第4节:数据流—FileStream 类
  • 物联网开发笔记(2)- 使用Wokwi仿真树莓派Pico点亮LED灯代码分析
  • Vue路由实例
  • 第一章 软考架构师之计算机系统组成与体系结构
  • Mac中无法运行旧版本印象笔记:版本太旧 你的本地印象笔记数据是由新版印象笔记管理
  • Educational Codeforces Round 134 (Rated for Div. 2)
  • 算法设计与分析作业——递归循环
  • c++ 生成dll并引用
  • 新160个CrackMe分析-第1组:1-10(上)
  • 【技术性】Search知识
  • 30秒的PHP代码片段(1)数组 - Array
  • Android 控件背景颜色处理
  • CSS实用技巧干货
  • HTTP 简介
  • JavaScript设计模式系列一:工厂模式
  • JavaScript异步流程控制的前世今生
  • node-glob通配符
  • node入门
  • October CMS - 快速入门 9 Images And Galleries
  • react 代码优化(一) ——事件处理
  • React16时代,该用什么姿势写 React ?
  • Redis在Web项目中的应用与实践
  • text-decoration与color属性
  • VUE es6技巧写法(持续更新中~~~)
  • 产品三维模型在线预览
  • 基于组件的设计工作流与界面抽象
  • 排序算法学习笔记
  • 使用agvtool更改app version/build
  • 数组大概知多少
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​力扣解法汇总946-验证栈序列
  • #{}和${}的区别是什么 -- java面试
  • #pragam once 和 #ifndef 预编译头
  • (3)nginx 配置(nginx.conf)
  • (poj1.2.1)1970(筛选法模拟)
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (九)One-Wire总线-DS18B20
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十五)使用Nexus创建Maven私服
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET业务框架的构建
  • .Net中间语言BeforeFieldInit