什么是推导式

大家好,今天我总结一下Python的推导式,首先让我们来看定义

推导式(comprehensions)是Python的一种独有特性,是可以从一个数据序列构建另一个新的数据序列的结构体。一般有三种使用最多的推导式:

  • 列表推导式(list comprehensions)
  • 字典推导式(dict comprehensions)
  • 集合推导式(set comprehensions)

使用推导式可以简化代码的同时提高效率,在我的个人使用场景中,用的最多的还是列表推导式,接下来我会一一介绍这三种常见的推导式,最后通过一个简单实战发现推导式的高效之处

列表推导式(list comprehensions)

模板

首先,让我们看看使用列表推导式的基础模板:

  • [ expression for item in list if conditional ] 简单来说,遍历一个list,得到每一个元素item,我们相对item进行哪些操作,写在expression里就可以,如果对筛选有什么条件,可以放在if后面

下面可以通过大量实例帮助大家理解

使用实例

先看第一个小栗子,在这里我们用for循环常规遍历一个字符串‘human’,把每一字母作为元素放在一个叫h_letters的数组里面:

h_letters = []
for letter in 'human':h_letters.append(letter)print(h_letters)![enter image description here](https://user-gold-cdn.xitu.io/2019/6/14/16b55313e2dd1a43?w=404&h=133&f=png&s=31177)Out:['h', 'u', 'm', 'a', 'n']复制代码

如果我们根据列表推导式的定义模板,可以简化如下:

h_letters = [ letter for letter in 'human' ]
print( h_letters)Out: ['h', 'u', 'm', 'a', 'n']
复制代码

这样的话便捷了很多,看上去也很容易理解,这里我们在expression部分什么都没有写,只是提出了每个元素而已,运行时的python执行方式如下:

我们可以在expression的部分进行很多操作,比如:

h_letters = [ letter.upper() for letter in 'human' ]
print( h_letters)Out: ['H', 'U', 'M', 'A', 'N']
复制代码

这样我们可以很容易的实现字母的大小写转化

同样的,我们可以在if后面写出筛选条件,比如这里,我们想要提出从-20 ~ 20中所有能被3整除的正数:

result = [num for num in range(-20,20)        if num %3==0 and num > 0]   print(result)       #多个条件可以用and连接Out: [3, 6, 9, 12, 15, 18]
复制代码

列表推导式的实际应用场景十分广泛,它和lambda不同,是真正好理解,提高效率的python特性之一,这里相信聪明的你已经想到了更多用法!

字典推导式(dict comprehensions )

模板

让我们看先来看使用字典推导式的基础模板:

  • { key:value for key,value in existing_data_structure }

这里和list有所不同,因位dict里面有两个关键的属性,key 和 value,但大同小异,我们现在的expression部分可以同时对 key 和 value 进行操作

下面来看最常见的应用

使用实例

首先最实用的功能莫过于可以实现一个dict的key,value值互换:

person = {'name':'xiaobai','city':'paris'}
person_reverse = {v:k for k,v in person.items()}   #简单互换key和value的值即可print(person_reverse)
Out: {'xiaobai': 'name', 'paris': 'city'}
复制代码

这里就非常方便了用字典推导式,不然的话如果用for循环,会稍微麻烦一些。 让我们再看下一个很巧的例子:

nums = {'a':10,'b':20,'A':5,'B':3,'d':4}
num_frequency  = {k.lower():nums.get(k.lower(),0) + nums.get(k.upper(),0)for k in nums.keys() }print(num_frequency)Out: {'a': 15, 'b': 23, 'd': 4}
复制代码

这里使用的就比较灵活,我们有一个数据,key是字母的大小写混在一起,我们想统计同一个key(大小写都包括)所对应的数字出现总和,所以在新建的num_frequency 字典用使用了推导式,这里我们遍历的是dict.keys()配合dict.get()方法,当然,如果仅仅是为了实现这个功能,我们有更好的办法,这里只是为了介绍推导式

再比如下面的例子:

fruit = ['apple','banana','organge','mango','peach']fruit_len = {f:len(f) for f in fruit}
print(fruit_len)Out:{'apple': 5, 'banana': 6, 'organge': 7, 'mango': 5, 'peach': 5}复制代码

我们有一个fruit的list,现在想要得到每一种水果的单词长度,就可以通过图中所示的方法实现,非常容易

最后再来看一个字典推导式配合枚举(enumerate)的例子:

fruit = ['apple','organge','banana','mango','peach']fruit_positon = {v:i for i,v in enumerate(fruit)}
print(fruit_positon)Out: {'apple': 0, 'organge': 1, 'banana': 2, 'mango': 3, 'peach': 4}复制代码

还是用刚才的list,这次我们得到的key是fruit的每个元素,value则是该元素在fruit所在的index

集合推导式(Set comprehensions)

模板

让我们看先来看使用集合推导式的基础模板:

  • { expression for item in Sequence if conditional }

其实集合推导式和list的推导式很像,但是既然是集合,肯定会配合利用Set的特有属性来实现我们的目的,如果你还对Set这种数据结构不够了解,可以参考我之前的文章:Python 进阶之路 (四) 先立Flag, 社区最全的Set用法集锦

下面来看最常见的应用

使用实例

首先,我们来看一个根据Set值唯一的特性的例子,我们有一个list叫names,用来存储名字,其中的数据很不规范,有大写,小写,还有重复的,我们想要去重并把名字的格式统一为首字母大写,实现方法便是用Set推导式:

names = [ 'Bob', 'JOHN', 'alice', 'bob', 'ALICE', 'James', 'Bob','JAMES','jAMeS' ]
names_standard = { n[0].upper()+n[1:].lower() for n in names}print(names_standard)
Out: {'John', 'Bob', 'James', 'Alice'}复制代码

这里就不再举很多的其他例子了,因为使用的方式多种多样,剩下的就靠广大人民群众的智慧自行开发即可!

简单实战

现在让我们来看一个比较综合的例子!我们现在手里有一个英文字典的dictionary.txt文件,包含从A~Z的单词

具体需求:我们想要找到长度大于5的正反拼写都具有实际含义的单词

我们现在会通过各种推导式来实现这个目标,我会在文章最后把txt文件及Python文件下载链接附上,这样大家如果先要练习可以自行下载

首先,我们的初始目录结构如下:

这里我新建了一个test文件夹,把dictionary.txt 文件和python文件放在一起方便读取,开始之前,先大概看下txt文件长什么样子:

第一步:读取dictionary.txt中的单词,选出长度大于5的


with open('dictionary.txt') as dictionary_file:words = (line.rstrip() for line in dictionary_file)words_over_five_letters = [w for w in words if len(w)>5 ]复制代码

这里通过列表推导式words_over_five_letters 用来存储所有长度大于5的单词

第二步:将上一步选出的单词全部以倒序的方式存储在一个集合里

reversed_words ={word[::-1]for word in words_over_five_letters}
复制代码

通过set推导式来实现

第三步:通过 if 条件筛选得出结果

reversible_words = [wordfor word in words_over_five_lettersif word in reversed_words
]for word in reversible_words[0:20]:print(word)Out:abroodagenesamaroidamunamanimalanimesbruteddarterdecartdecurtdeedeeddeflowdegamidegenerdeggeddeifieddeifierdeliverdenier
复制代码

这里最后共有203个结果,我们只看了前20个,验证方法就是只要长度大于5的单词同时存在于reversed_words和words_over_five_letters即可

完整代码如下:


with open('dictionary.txt') as dictionary_file:words = (line.rstrip() for line in dictionary_file)words_over_five_letters = [w for w in words if len(w)>5 ]reversed_words ={word[::-1]for word in words_over_five_letters}reversible_words = [wordfor word in words_over_five_lettersif word in reversed_words
]for word in reversible_words[0:20]:print(word)
复制代码

资料下载

  • dictionary.txt
  • dictionary.py

总结

这次为大家总结了python里面常见的三种推导式相关用法以及最后的小实战环节,希望大家喜欢,双击666点个赞吧!!

转载于:https://juejin.im/post/5d03601551882548ac4398ce

小白的Python 学习笔记(八)推导式详解相关推荐

  1. Python学习笔记 —— 独步天下推导式语法糖

    Python学习笔记 -- 独步天下推导式语法糖 前言 介绍 列表推导式 获取当月天数 字典推导式 模拟三条用户数据 结束语 前言 最近心血来潮,学习了一下Python,其中关于 推导式语法糖 感觉功 ...

  2. python学习笔记day08 文件功能详解

    file.read():读取文件的全部内容 file=open("dang",mode='r+',encoding='utf-8') print(type(file.read()) ...

  3. 【学习笔记】线段树详解(全)

    [学习笔记]线段树详解(全) 和三个同学一起搞了接近两个月的线段树,头都要炸了T_T,趁心态尚未凉之前赶快把东西记下来... [目录] [基础]作者:\((Silent\)_\(EAG)\) [懒标记 ...

  4. 【STM32】标准库与HAL库对照学习教程八--串口通信详解

    [STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...

  5. 列表推导式详解:[i for i in L]

    python的一般for循环:for i in x:#x是列表对象 而列表推导式是:[i for i in x] 其意为:用for i in x的所有遍历结果i来组成一个新的列表 1.列表推导式详解: ...

  6. Laravel学习笔记汇总——Collection方法详解

    ## Laravel学习笔记汇总--Collection方法详解 本文参考:https:// laravel.com/docs/8.x/collections // 返回整个底层的数组 collect ...

  7. java 检查bytebuf长度_Java学习笔记16-Netty缓冲区ByteBuf详解

    Java学习笔记16-Netty缓冲区ByteBuf详解 Netty自己的ByteBuf ByteBuf是为解决ByteBuffer的问题和满足网络应用程序开发人员的日常需求而设计的. JDK Byt ...

  8. spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)

    spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...

  9. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  10. [原创]Saltstack学习笔记:命令参数详解以及配置文件说明

    很久没有更新saltstack的文章了,今天还是来更新一点,又开始对saltstack复习了一下. 前边写了一点<saltstack入门概述(1)>以及<Saltstack如何安装( ...

最新文章

  1. python窗口程序-Python GUI 编程(Tkinter)
  2. C++ Primer 5th笔记(chap 16 模板和泛型编程)类型无关和模板编译
  3. C语言指针怎么存二维数组,C语言怎么用指针代替二维数组
  4. DATA SHARING Help JetBrains improve its products by sending anonymous data about features and plugin
  5. 如何降低软件项目的风险 -- 包括客户的风险,软件提供商的风险
  6. win10系统托盘图标不见了_win10托盘图标不显示怎么回事_win10任务栏托盘图标显示不完全如何修复...
  7. 大一下学期,大二上学期,这一年
  8. 中南大学网络教育计算机考试答案,2015年6月中南大学网络教育课程考试《计算机组成原理》复习题及参考答案.pdf...
  9. linux vim创建文件配置文件,vim linux 强大的配置文件
  10. 先码后看 Spring源码解析 侵立删
  11. 吴恩达深度学习作业之deepleraning_L1W2_h2
  12. Velodyne-16完全配置
  13. 无需安装软件架设NOD32升级服务器指南!
  14. 计算机配置无线网卡在哪能找到,电脑的无线网卡在哪里
  15. apollo决策规划学习--慢速障碍物超车
  16. 函数最值题目及答案_二次函数的最值问题举例(附练习答案)
  17. 【原创】Jlink在ADS下的配置说明及常见问题解决办法
  18. c语言printf( aaa ),有大佬知道那里错了吗。aaa=jia();那报错了#incl
  19. Arduino基础项目九:制作感光灯
  20. 《信息安全技术 关键信息基础设施安全保护要求》国家标准在京发布

热门文章

  1. HTML页面静态化技术
  2. java erc 2.0_如何使用Web3j库管理Java中的ERC20令牌
  3. java从小白到老白②
  4. 用MATLAB绘制高斯分布曲线
  5. 张瑞驰作文分享《蚕的自述》
  6. gradient checking
  7. 黎曼猜想(一) 欧拉乘积式
  8. 游戏系列之无限弹窗游戏
  9. iOS开发:下架App的步骤
  10. 某保险公司商业智能成功应用案例