推导式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. stress工具使用指南和结果分析(好好好测试通过)

    stress工具使用指南和结果分析 佛心看世界关注 0.1152019.05.13 09:17:35字数 547阅读 1,112 #stress `stress' imposes certain ty ...

  2. yum 命令详解-yum仓库配置文件详解

    yum安装的优点 1.必须得有网络,通过网络获取软件. 2.管理rpm包 3.自动解决依耐 4.命令简单好用 5.生产最佳实践 yum命令详解 # linux安装软件的三种方式 1.rpm安装 2.源 ...

  3. kvm虚拟化安装与部署(2)

    一.虚拟化VT开启确认 KVM 本身也有一些弱点,那就是相比裸金属虚拟化架构的 Xen . VMware ESX 和 HyperV , KVM 是运行在 Linux 内核之上的寄居式虚拟化架构,会消耗 ...

  4. 8.12-14 df 、mkswap、swapon、swapoff、sync

    8.12 df:报告文件系统磁盘空间的使用情况   -a    显示所有文件系统 -h    以容易理解的格式显示磁盘的使用情况端 -i    显示文件系统的inode信息迷 -t    显示指定类型 ...

  5. 解决idea查不到插件

    http://127.0.0.1:1080

  6. lms框架模块详解

    模块的定义 一般地,开发者如果想要在一个自定义的程序集(包)中注册相关的服务,或者在应用初始化或停止时执行一段自定义的代码,那么您可能需要将该程序集(包)定义为一个模块. lms框架存在两种类型的模块 ...

  7. (最全)No dashboards are active for the current data set. 解决tensorboard无法启动和显示问题

    按照网上的教程,我无法正常启动tensorboard,全过程没有报错,但是打开tensorboard显示No dashboards are active for the current data se ...

  8. synchronized使用及java中的原子性问题

    1.Synchronized关键字使用 class X { // 修饰非静态方法 synchronized void foo() { // 临界区 } // 修饰静态方法 synchronized s ...

  9. AI框架精要:设计思想

    AI框架精要:设计思想 本文主要介绍飞桨paddle平台的底层设计思想,可以帮助用户理解飞桨paddle框架的运作过程,以便于在实际业务需求中,更好的完成模型代码编写与调试及飞桨paddle框架的二次 ...

  10. C/C++语言编程的隐患!

    C/C++语言编程的隐患! 本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内.内存错误是 C 和 C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决 ...