推导式comprehensions(又称解析式),是Python的一种独有特性。

推导式是可以从一个数据序列构建另一个新的数据序列(的一种结构体)。

Python中共有三种推导,在Python2和3中都有支持:

  • 列表推导式
  • 字典推导式
  • 集合推导式

1、列表推导式

作用:用一个表达式创建一个有规律的列表或控制一个有规律列表。

列表推导式又叫列表生成式。

(1)快速体验

需求:创建一个0-10的列表。

  • while循环实现
    # 1. 准备一个空列表
    list1 = [] # 2. 书写循环,依次追加数字到空列表list1中
    i = 0
    while i < 10:
    list1.append(i)
    i += 1 # 结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(list1)
  • for循环实现
    list1 = []
    for i in range(10):
    list1.append(i)
    # 结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(list1)
  • 列表推导式实现
    """
    因为是列表推导式,所以等号右边的表达式要用[]括起来
    因为最终要返回一个列表。 在推导式中,读与写都从for循环开始,
    for的左侧是一个返回值,一次for循环返回的数值。
    for每一次遍历,都向列表中添加一个i变量。
    """
    # 结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    list1 = [i for i in range(10)]
    print(list1)

    列表推导式就是化简代码,创建或控制有规律的列表。

(2)带if的列表推导式

需求:创建0-10的偶数列表

  • 方法一:通过range()步长实现
    # 结果:[0, 2, 4, 6, 8]
    list1 = [i for i in range(0, 10, 2)]
    print(list1)
  • 方法二:通过if实现
    # 1. for循环加if 创建有规律的列表
    list2 = []
    for i in range(10):
    if i % 2 == 0:
    list2.append(i)
    # 结果:[0, 2, 4, 6, 8]
    print(list2) # 2.把for循环配合if的代码 改写 带if的列表推导式
    list1 = [i for i in range(10) if i % 2 == 0]
    # 结果:[0, 2, 4, 6, 8]
    print(list1)

(3)多个for循环实现列表推导式

需求,创建列表如下:

[(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

代码如下

list1 = [(i, j) for i in range(1, 3) for j in range(3)]
print(list1) # 推导过程如下
# 多for的列表推导式等同于for循环嵌套 # [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
# 数据1 : 1 和 2 range(1,3)
# 数据2 :0 1 2 range(3)
list1 = []
for i in range(1, 3):
for j in range(3):
# 列表里面追加元组: 循环前准备一个空列表,
# 然后这里追加元组数据到列表
list1.append((i, j)) print(list1) # 多个for实现列表推导式
list2 = [(i, j) for i in range(1, 3) for j in range(3)]
print(list2)

2、字典推导式

思考:如果有如下两个列表:

list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']

如何快速合并为一个字典?

答:用for循环拼接可以实现,但是我们可以通过改写for循环,变成一个字典推导式。

字典推导式作用:快速合并列表为字典或提取字典中目标数据。

通过下面示例快速体验字典推导式。

(1)创建一个字典

字典key是1-5数字,value是这个数字的2次方。

# dict1 = {k: v for i in range(1, 5)}
dict1 = {i: i**2 for i in range(1, 5)}
print(dict1) # {1: 1, 2: 4, 3: 9, 4: 16}

{i:i**2}表示的是一个字典,keyivaluei**2

最后要返回一个字典,所以右边表达式的最外层是一个大括号。

(2)将两个列表合并为一个字典

list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man'] dict1 = {list1[i]: list2[i] for i in range(len(list1))}
print(dict1)
# 结果:{'name': 'Tom', 'age': 20, 'gender': 'man'}

总结:

  • 如果两个列表数据个数相同,len统计任何一个列表的长度都可以。
  • 如果两个列表数据个数不同,len统计数据多的列表数据个数会报错;len统计数据少的列表数据个数不会报错。(这点一定要注意)

(3)提取字典中目标数据

counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}

# 需求:提取上述电脑数量大于等于200的字典数据
count1 = {key: value for key, value in counts.items() if value >= 200}
print(count1) # {'MBP': 268, 'DELL': 201}

3、集合推导式

集合推导式比上面两个推导式使用的频率要少很多。

需求:创建一个集合,数据为下方列表的2次方。

list1 = [1, 1, 2]

代码如下

list1 = [1, 1, 2]
set1 = {i ** 2 for i in list1}
print(set1) # {1, 4}

注意:集合有数据去重功能。

4、补充提示

我们如何查看Python中关于序列的相关文档:

  • 打开文件找到序列部分文档

    [The Python Standard Library(Python标准库)] —> 右边页面[Sequence Type]

  • Common Sequence Operations下的列表为序列的通用操作。

    就是可变序列和不可变序列都可以用的方法或者函数。
  • Mutable Sequence Types下的列表为可变序列可以用的方法或者函数。

『无为则无心』Python序列 — 24、Python序列的推导式的更多相关文章

  1. 『无为则无心』Python基础 — 16、Python序列之字符串的下标和切片

    目录 1.序列的概念 2.字符串的下标说明 3.字符串的切片说明 1.序列的概念 序列sequence是Python中最基本的数据结构.指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通 ...

  2. 『无为则无心』Python序列 — 20、Python元组的介绍与使用

    目录 1.元组的应用场景 2.定义元组 3.元组的常见操作 @1.按下标查找数据 @2.index()方法 @3.count()方法 @4.len()方法 4.元祖中的列表元素 5.扩展:序列封包和序 ...

  3. 『无为则无心』Python基础 — 12、Python运算符详细介绍

    目录 1.表达式介绍 2.运算符 (1)运算符的分类 (2)算数运算符 (3)赋值运算符 (4)复合赋值运算符 (5)比较运算符 3.逻辑运算符 拓展1:数字之间的逻辑运算 拓展2:Python中逻辑 ...

  4. 『无为则无心』Python基础 — 61、Python中的迭代器

    目录 1.迭代的概念 2.迭代器的概念 3.可迭代的对象(Iterable) 4.迭代器对象(Iterator) 5.迭代器的使用体验 (1)基本用法 (2)实际应用 1.迭代的概念 (1)什么是迭代 ...

  5. 『无为则无心』Python基础 — 62、Python中自定义迭代器

    目录 1.迭代器对象的创建 2.实际应用案例 3.总结: 1.迭代器对象的创建 迭代器是一种可以被遍历的对象,并且能够作用于next()函数,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问 ...

  6. 『无为则无心』Python基础 — 63、Python中的生成器

    目录 1.为什么要有生成器 2.创建生成器 (1)简单创建生成器 (2)生成器的使用 3.yield关键词 (1)yield关键词说明 (2)send()方法说明 4.使用yield实现斐波那契数列 ...

  7. 『无为则无心』Python基础 — 4、Python代码常用调试工具

    目录 1.Python的交互模式 2.IDLE工具使用说明 3.Sublime3工具的安装与配置 (1)Sublime3的安装 (2)Sublime3的配置 4.使用Sublime编写并调试Pytho ...

  8. 『无为则无心』Python基础 — 6、Python的注释

    目录 1.注释的作用 2.注释的分类 单行注释 多行注释 3.注释的注意事项 4.什么时候需要使用注释 5.总结 提示:完成了前面的准备工作,之后的文章开始介绍Python的基本语法了. Python ...

  9. 『无为则无心』Python基础 — 7、Python的变量

    目录 1.变量的定义 2.Python变量说明 3.Python中定义变量 (1)定义语法 (2)标识符定义规则 (3)内置关键字 (4)标识符命名习惯 4.使用变量 1.变量的定义 程序中,数据都是 ...

随机推荐

  1. Phoenix 使用教程

    引言 hbase 提供很方便的 shell 脚本,可以对数据表进行 CURD 操作,但是毕竟是有一定的学习成本的,基本上对于开发来讲,sql 语句都是看家本领,那么,有没有一种方法可以把 sql 语句 ...

  2. mysql基础之数据库备份和恢复的基础知识

    备份数据的最终目的是为了在出现一些意外情况时,能够通过备份将数据还原,所以单单的备份数据往往是无法满足还原时的需求的,所以在备份数据库时,除了要备份数据本身,还要备份相关的数据库环境,如配置文件,定时 ...

  3. Java Stream 流(JDK 8 新特性)

    什么是 Steam Java 8 中新增了 Stream(流)来简化集合类的使用,Stream 本质上是个接口,接口中定义了很多对 Stream 对象的操作. 我们知道,Java 中 List 和 S ...

  4. python3 读取txt文件数据,绘制趋势图,matplotlib模块

    python3 读取txt文件数据,绘制趋势图 test1.txt内容如下: 时间/min cpu使用率/% 内存使用率/% 01/12-17:06 0.01 7.61 01/12-17:07 0.0 ...

  5. scrapy使用response.body时编码问题

    scrapy使用response.body时编码问题 摘要:scrapy使用response.body时编码问题.如果在使用responses.body获取数据时,需要将其编码转换成unicode,即 ...

  6. Docker学习(12) Dockerfile构建过程

    Dockerfile的构建过程 以上为构建缓存

  7. 'utf-8' codec can't decode byte 0xd5 in position XXX: invalid continuation byte问题

    找了一下午,各种资料搜集,愣是没搜出来答案. 结果今天早上,做一个小小的改变,就整出来了... 步骤如下: 1.打开excel,全选数据 2.新建记事本,粘贴,选择脚本,更改字体: 3.新建Excel ...

  8. Darknet_Yolov3模型搭建

    Darknet_Yolov3模型搭建 YOLO(You only look once)是目前流行的目标检测模型之一,目前最新已经发展到V3版本了,在业界的应用也很广泛.YOLO的特点就是"快 ...

  9. RGB-D对红外热像仪和毫米波雷达标定

    RGB-D对红外热像仪和毫米波雷达标定 Extrinsic Calibration of Thermal IR Camera and mmWave Radar by Exploiting Depth ...

  10. P1091 [NOIP2004 提高组] 合唱队形

    题目描述 $N$位同学站成一排,音乐老师要请其中的$\left ( N-K\right )$位同学出列,使得剩下的$K$位同学排成合唱队形. 合唱队形是指这样的一种队形:设$K$位同学从左到右依次编号 ...