推导式 Compression

推导式 ( Compression )是Python语言的一大特色

相比于其他语言而言, 推导式使得Python能够编辑的进行循环,创建出特定的字典,列表等可迭代对象

使用推导式可以避免代码的冗长,简化代码风格,使得代码更加的Pythonic

本文就将详细介绍Python中的推导式

推导式可以分为下面几种:

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

其实还有生成器推导式,不过不是很常用,因此不加以介绍

列表推导式

列表推导式指的是可以用于生成列表的推导式

简单的列表推导式

简单的列表推导式的语法如下,这样我们就能够快捷的创建列表

[ 表达式 for 变量 in 可迭代对象 ]

示例如下

List1=[x for x in 'abcd']
List2=[y**2 for y in range(6)]
List3=[i+1 for i in [-1,-2,-3,-4]]
List1
List2
List3
>>>
['a', 'b', 'c', 'd']
[0, 1, 4, 9, 16, 25]
[0, -1, -2, -3]

运行结果如下(In [1]中的内容可以不管)

带条件的列表推导式

上面我们创建了简单的推导式,实际上还可以创建带条件的推导式,这样我们能够创建更复杂的表达式

带条件的列表推导式如下

[ 表达式 for 变量 in 可迭代对象 if 条件 ]

例子如下

List4=[x for x in range(6) if x%2==0]
List5=[i**2 for i in range(10) if i**2 in range(10)]
List4
List5
>>>
[0, 2, 4]
[0, 1, 4, 9]

嵌套列表推导式

我们前面的列表推导式实际上都只有一个变量,但是我们其实可以使用多变量的列表推导式

具体时候类似于两个for循环嵌套,因此又可以称为嵌套列表式

以双变量和三变量为例的列表推导式如下, 按照这样的规则实际上可以扩展到n个变量的嵌套列表推导式

双变量列表推导式

[ 表达式(可含变量1和变量2) for 变量1 in 可迭代对象1 for 变量2 in 可迭代对象2 ]

三变量列表推导式

[ 表达式(可含变量1和变量及变量3) for 变量1 in 可迭代对象1 for 变量2 in 可迭代对象2 for 变量3 in 可迭代兑现3]

例子如下

List6=[(x,y) for x in range(-2,2) for y in [0,1]]
List7=[x+y+z for x in range(-2,2) for y in range(3) for z in [0,1]]
List6
List7
>>>
[(-2, 0), (-2, 1), (-1, 0), (-1, 1), (0, 0), (0, 1), (1, 0), (1, 1)]
[-2, -1, -1, 0, 0, 1, -1, 0, 0, 1, 1, 2, 0, 1, 1, 2, 2, 3, 1, 2, 2, 3, 3, 4]

运行结果如下

复杂列表推导式

实际上我们能够结合带条件的列表推导式和嵌套列表推导式,由此可以有一些非常Pythonic的操作

List8=[(x,y) for x in range(-20,20,1) for y in range(-20,20,1) if y==x**2 ]
List8
>>>
[(-4, 16), (-3, 9), (-2, 4), (-1, 1), (0, 0), (1, 1), (2, 4), (3, 9), (4, 16)]

上面的代码就是求y=x**2的曲线上的点的代码

其实后续结合Numpy,Pandas,Matplotlib等诸多第三方库还可以进行绘图,

此外还能通元组赋值, zip和enumerate等函数产生妙用

具体就不一一细讲了,总之列表作Python中最常用的结构型数据类型, 列表推导式的妙用非常多

字典推导式

类似于列表推导式,字典推导式也可以结合条件语句以及多变量嵌套

简单的字典推导式

简单的字典推导式只使用一个变量,因此键和键值的表达式中都需要有变量

声明语句如下

{ 键表达式 : 值表达式 for 表达式 in 可迭代对象 }

举例如下

Dict1={i : i**2 for i in range(6)}
Dict1
>>>
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

嵌套的字典推导式

实际上一般在创建字典的时候,我们使用的键和键值是不一样的,因此我们更常见的做法是使用嵌套的字典推导式,即使用多个变量来进行循环,这样来创建不同的键值对

{ 键表达式 : 值表达式 for 变量1 in 可迭代对象1 for 变量2 in 可迭代对象2 }

示例如下:

Dict1={letter : i for i in range(6) for letter in "abcdef"}
Dict1
>>>
{'a': 5, 'b': 5, 'c': 5, 'd': 5, 'e': 5, 'f': 5}

带条件的字典推导式

其实和嵌套的字典推导式一样,略

复杂字典推导式

复杂字典推导式能够实现各种骚气的功能

具体就不细说了,我下面给一个例子,更多的使用还需要大家自己开发

Sentece='This is a sentence waiting to be count that how many times does letters occur in this sentence'
Dict2={letter : Sentece.lower().count(letter) for letter in list('abcdefghijklmnopqrstuvwxyz') }
Dict2
>>>
{'a': 4,'b': 1,'c': 5,'d': 1,'e': 11,'f': 0,'g': 1,'h': 4,'i': 7,'j': 0,'k': 0,'l': 1,'m': 2,'n': 8,'o': 5,'p': 0,'q': 0,'r': 2,'s': 8,'t': 12,'u': 2,'v': 0,'w': 2,'x': 0,'y': 1,'z': 0}

这个例子的作用就是查询这一句话中26个字母出现的字数,可以看到在C/C++中需要写很多行代码才能实现的功能在Python中只需要一行就能结束

集合推导式

集合推导式和列表推导是一样的,三种用法都一样,就不赘述了

{ 表达式 for 表达式 in 可迭代变量}

例子如下:

Set1={x for x in range(6)}
Set1
>>>
{0, 1, 2, 3, 4, 5}

Python中的推导式相关推荐

  1. Python中列表推导式同filter和map的比较

    symbols = "symbols" beyond_ascii = [ord(s) for s in symbols if ord(s) > 100]beyond_asci ...

  2. Python中使用推导式创建序列

    推导式创建序列 推导式是从一个或者多个迭代器快速创建序列的一种方法.它可以将循环和条件判断结合,从而避免冗长的代码.推导式是典型的Python 风格. 列表推导式 列表推导式生成列表对象,语法如下: ...

  3. python中字典推导式

    目录 一.字典推导式: 二.语法: 1.语法一: 2.语法二: 三.字典推导式实战: 1.在字典中提取或者修改数据,返回新的字典: 2.在字符串中提取数据,返回新的字典: 3.将字符串 "k ...

  4. python用列表推导式_python如何使用列表推导式

    python使用列表推导式的方法:1.用于使用其他列表创建一个新列表:2.可以对原列表进行变换和筛选:3.对多重嵌套的list进行变换筛选. python使用列表推导式的方法: python中列表推导 ...

  5. python的各种推导式(列表推导式、字典推导式、集合推导式)

    python的各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体 ...

  6. python元祖推导式_python推导式深入讲解

    python推导式是非常简洁高效的数据整合手段,功能强大且运行效率极高.本文将带你深入了解并掌握推导式,并将告诉你什么时候该用推导式什么时候不该用推导式. 一.推导式语法 变量名 = [ 表达式 fo ...

  7. python的各种推导式

    python的各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体 ...

  8. python使用列表推导式(list comprehension)和itertools生成浮点数列表

    python使用列表推导式(list comprehension)和itertools生成浮点数列表 目录 python使用列表推导式(list comprehension)和itertools生成浮 ...

  9. 链表list(链式存储结构实现)_VOL.2 如何在python中实现链式存储结构

    一.前言 链式存储作为一种重要的数据存储方式有着极强的数据组织能力.灵活型和动态性,在众多数据结构中应用非常广泛.所谓链式存储结构,就是采用分散的存储空间分别存储每一组数据再通过地址链接的形式将全部数 ...

最新文章

  1. [转]C#网络编程(异步传输字符串) - Part.3
  2. Oracle系统表查询
  3. php和python和java-python和java,php,c,c#,c++的对比
  4. 一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户...
  5. 『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办
  6. EncryptHelper
  7. 关于easyui combobox下拉框实现多选框的实现
  8. 对zebra的一点思考 --- 002
  9. Chango的数学Shader世界(十八)RayTrace三维分形(三)—— 完善,距离场软阴影
  10. 卧槽,物色了一款隐秘拍摄神器,别乱用!
  11. 中国汽车系统为Alfa Romeo首款紧凑型SUV电动车开发新型转向系统
  12. debian/ubuntu 64bit 安装 android sdk时adb无法编译的问题
  13. html5 打气球小游戏,javascript开发打气球小游戏
  14. 2016 我的年终小结:一直在路上
  15. excel中“~”替换成“-”
  16. Python学习:代码过长的换行方式
  17. 网络推广员的工作职责,如何做好网络推广员
  18. 坚果投影仪陷入双11刷单漩涡?良性发展才是硬道理!
  19. Python 基础知识整理-1
  20. CUMT2017赛宁杯 GUESS

热门文章

  1. 无念品牌用实力吸引硬汉任天野代言,强强联合,够“野”
  2. 前端模块化的十年征程
  3. 小程序源码:笑话与趣图框架微信小程序-多玩法安装简单
  4. 千锋老师追忆Hadoop大数据
  5. LPSTR,LPCSTR,LPWSTR,LPCWSTR,LPTSTR,LPCTSTR转换
  6. 去中心网络上的内容寻址
  7. MVC Html.DropDownList 和DropDownListFor 的常用方法
  8. 写给所有想爱的,在爱的和已经失去爱的人
  9. LeetCode日记_007_猜字谜
  10. java compareTo 整数_int compareTo(Integer anotherInteger)