热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

大家好,今天我总结一下Python的推导式,首先让我们来看定义推导式(comprehensions)是Python的一种独有特性,是可以从一个数据序列构建另一个新的数据序列的结构体


大家好,今天我总结一下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 = [
word
for word in words_over_five_letters
if word in reversed_words
]
for word in reversible_words[0:20]:
print(word)


Out:
abrood
agenes
amaroid
amunam
animal
animes
bruted
darter
decart
decurt
deedeed
deflow
degami
degener
degged
deified
deifier
deliver
denier

这里最后共有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 = [
word
for word in words_over_five_letters
if word in reversed_words
]
for word in reversible_words[0:20]:
print(word)

资料下载



  • dictionary.txt

  • dictionary.py


总结


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




推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
author-avatar
寒风中挣扎_427
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有