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

1. 引言

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

2. Level1: 基础用法

最简单的列表生成公式如下:

[En]

The simplest list generation formula is as follows:

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

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

[En]

The above code implements the operation of squaring a single element in the list.

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()

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

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

5. Level4: 加入 zip()

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

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: 加入三目运算符

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

三元运算符也可用于列表生成,如下例所示:

[En]

The ternary operator can also be used in list generation, as shown in the following example:

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

7. Level6: 嵌套循环

当然,事实上,我们也可以在列表生成中使用嵌套循环。让我们看一个例子,如下所示:

[En]

In fact, of course, we can also use nested loops in list generation. Let’s look at an example, as follows:

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]

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

[En]

In essence, the equivalent code for the above implementation is as follows:

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

8. Level7: 嵌套列表生成式

在更高级的级别上,我们可以在列表生成器中嵌套列表生成器,例如:

[En]

At a more advanced level, we can nest list generators in list generators, as an example:

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: 合并上述所有技巧

最后,让我们结合上面描述的技术。让我们来看看下面的例子:

[En]

Finally, let’s combine the techniques described above. Let’s take a look at the following examples:

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]]

上面的实现没有多大意义,我们试图应用上面描述的所有技术,但毕竟代码太易读了。主要目的是展示我们可以结合各种技术来使我们的列表生成更加强大。

[En]

The above implementation doesn’t make much sense, and we try to apply all the techniques described above, but after all, the code is too readable. The main purpose is to show that we can combine a variety of techniques to make our list generation more powerful.

10. 应用栗子

好了,让我们来看一个实际的应用程序示例!假设我们的班级中有以下学生信息:

[En]

All right, let’s look at a practical application example! Suppose we have the following student information in our class:

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,那么该学生就有资格获奖。在这里,我们需要编写代码来查找上面列表中有资格获得该奖项的男孩。示例代码如下:

[En]

The above list shows the name, gender and test scores of each student, assuming that if a student has an average score of ≥ 50, then the student is eligible to win the prize. Here we need to write code to find the boys in the above list who are eligible for the award. The sample code is as follows:

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中的列表生成式的八重境界,并给出了相应的代码示例。

您学废了嘛?

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

Original: https://blog.51cto.com/u_15506603/5642551
Author: sgzqc
Title: 【Python】列表生成式中的八重境界

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/500186/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CSS 网格 Gird 布局

    通过将属性 display 的值设为 grid,HTML 元素就可以变为网格容器。 注意: 在 CSS 网格中,父元素称为容器(container),它的子元素称为项(items)…

    Python 2023年6月9日
    0112
  • 数据库实验3 完整性语言实验

    实验3 完整性语言实验 实验3.1实体完整性实验 1.实验目的 掌握实体完整性的定义和维护方法。 2.实验内容和要求 定义实体完整性,删除实体完整性。能够写出两种方式定义实体完整性…

    Python 2023年10月9日
    054
  • Python–matplotlib绘图

    绘制一个最简单的折线图 现在绘制一个简单的二维折线图,按如下代码画出折线图: -*- coding: utf-8 -*- #matplotlib小测试 ”’ import mat…

    Python 2023年9月1日
    079
  • SSTI注入

    文章目录 1.概念 * 1.1 什么是Flask 1.2 SSTI注入的原理 2.使用 * 2.1 Flask框架的使用 2.2 python内置方法介绍 – __cl…

    Python 2023年8月12日
    0136
  • 带你认识全新的华为云IoT路网数字化服务

    摘要:随着通信技术的发展,交通领域提出以C-V2X车路协同技术来弥补单车智能存在的缺陷,从而推动智能驾驶、自动驾驶技术的成熟。 当前,已有百余年历史的汽车产业,正在向网联化、智能化…

    Python 2023年10月25日
    070
  • python界面设计

    当开始做一些python项目的时候不知从何入手,看着七七八八的界面设计也慌了,看完这几篇水文后希望对大家有所帮助。 UI (user interface)是程序用户的交互界面,终端…

    Python 2023年8月2日
    094
  • Python:Pandas创建Dataframe数据框的六种方法

    创建 Dataframe主要是使用 pandas中的 DataFrame函数,其核心就是第一个参数: data,传入原始数据,因此我们可以据此给出六种创建 Dataframe的方法…

    Python 2023年8月26日
    0106
  • Pandas 01 快速入门

    Pandas(/ˈpændəz/)是一个开源的、BSD 许可的库,为 Python 编程语言提供高性能、易于使用的数据结构和数据分析工具。 Pandas 适合处理一个规正的二维数据…

    Python 2023年8月9日
    074
  • 场景之心跳应用

    一、心跳概述 常见的IM类应用,比如游戏,直播,聊天室或者客服系统,一般都要依靠服务端做消息中转,将从发送方接受的消息推送给接收方,为保证可靠,快速到达对端,⼤部分IM使⽤长连接建…

    Python 2023年10月23日
    0109
  • 欧洲发布统一电子设备的充电端口修正案,拟统一充电规格(USB Type-C)

    2022年6月7日,欧洲议会(European Parliament)发布一项关于无线电设备指令的修正案,用以统一常用的中小型便携式电子设备的充电端口。该修正案旨在减少每年产生的电…

    Python 2023年10月29日
    061
  • Win10安装flask

    写这篇文章是因为在网上找了好多安装flask的文章后依然没有安装成功,在这些文章里离成功最近的就是陈福国老师的文章了,但是老师并没有说安装virtualenv是在python的sc…

    Python 2023年8月10日
    0128
  • 强化学习-学习笔记4 | Actor-Critic

    Actor-Critic 是价值学习和策略学习的结合。Actor 是策略网络,用来控制agent运动,可以看做是运动员。Critic 是价值网络,用来给动作打分,像是裁判。 4. …

    Python 2023年10月25日
    0139
  • pytest 常用命令、插件合集;Python + pytest + requests + yaml

    一、pytest常用插件合集 pip install pytest 单元测试框架 pip install pytest-html 生成html测试报告 pip install py…

    Python 2023年9月11日
    088
  • 数据科学—赋能未来,Python崛起

    | 1.1 为什么是Python? 首先恭喜你朝着成为数据科学家迈出了一大步! 在本系列中,你将了解到数据科学中最流行的Python库: numpy、 pandas 和 matpl…

    Python 2023年8月28日
    057
  • 2-Allure的使用

    文章目录 * – Allure简介 – Allure环境搭建 – Allure使用示例 – Allure层级的设置 – …

    Python 2023年9月12日
    0103
  • java flask_用它5分钟以后,我放弃用了四年的 Flask

    有一个非常简单的需求:编写一个 HTTP接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行处理,并返回。 如果我们使用 Flask…

    Python 2023年8月13日
    0130
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球