申请专栏作者 参展
投稿发布
您的当前位置:主页 > 数据挖掘 > 正文

案例详解:理解Python中的“解析式”

来源: 时间:2019-08-31
请支持本站,点击下面的广告后浏览!

本篇文章将详细介绍解析式的基本要素及其各种形式。 可思数据-AI,sykv.com正版天机报图库,深度学习,机器学习,神经网络

内容来自可思数据sykv.com

Python中的解析式 本文来自可思数据(sykv.com),转载请联系本站及注明出处

解析式是允许在其他序列中构建序列的结构。Python 2.0介绍了列表解析式的概念,Python 3.0中进一步介绍了字典和集合解析式。 可思数据-数据挖掘,智慧医疗,机器视觉,机器人sykv.com

Pyhon中的解析式类型

可思数据sykv.com

Pyhon中的解析式类型 可思数据sykv.com

为什么解析式如此强大?本文将通过一个例子试着理解这一点。大家都知道Python提供了各种表达列表的方法。例如:

可思数据sykv.com

可以明确地将整件事写成:

本文来自可思数据(sykv.com),转载请联系本站及注明出处
 

可思数据-www.sykv.cn,sykv.com

  1. squares = [0, 1, 4, 9, 25]

或者,编写for循环以创建列表: 可思数据sykv.com,sykv.cn

 

内容来自可思数据sykv.com

  1. squares = []
  2. for num in range(6):
  3. squares.append(num*num)

创建列表的另一种方法是使用单行代码。

可思数据sykv.com,sykv.cn
 
可思数据-AI,sykv.com正版天机报图库,深度学习,机器学习,神经网络
  1. squares = [num*num for num in range(6)]

上面的这个单行叫做列表解析式,是创建列表的便捷方式。它不再依赖循环并精简了代码。下一部分将深入探讨列表的概念以及Python 3中提供的其他类型的解析式。

可思数据-数据挖掘,智慧医疗,机器视觉,机器人sykv.com

列表解析式

内容来自可思数据sykv.com

列表解析式是一种以简洁的方式在Python中定义和创建列表的方法。大多数情况下,列表解析式可以仅在一行代码中创建列表,无需担心初始化列表或设置循环。 可思数据-www.sykv.cn,sykv.com

列表解析式包括以下几个部分: 可思数据sykv.com,sykv.cn

列表解析式的各个部分

本文来自可思数据(sykv.com),转载请联系本站及注明出处

列表解析式的各个部分

内容来自可思数据sykv.com

比如说,需要找到前五个偶数的平方。如上一节所示,有两种方法可以做到这一点:使用显式的for循环或使用列表解析式。两种方法都试试看吧。

可思数据sykv.com

使用循环: 可思数据-AI,sykv.com正版天机报图库,深度学习,机器学习,神经网络

 可思数据-www.sykv.cn,sykv.com 
  1. even_squares = []
  2. >>> for num in range(11):
  3. ... if num%2 == 0:
  4. ... even_squares.append(num * num)>>> even_squares
  5. [0, 4, 16, 36, 64, 100]

使用列表解析式: 可思数据-AI,sykv.com正版天机报图库,深度学习,机器学习,神经网络

 可思数据-AI,sykv.com智能驾驶,人脸识别,区块链,大数据 
  1. even_squares = [num * num for num in range(11) if num%2 == 0]
  2. even_squares
  3. [0, 4, 16, 36, 64, 100]

如果仔细观察,可以看出只需重新排列For循环就可以创建列表解析式。

内容来自可思数据sykv.com

本文来自可思数据(sykv.com),转载请联系本站及注明出处

列表解析式是Python中对集合应用的一种符号表示方法,就好像数学中用到的集合表示方法。

可思数据sykv.com,sykv.cn

本文来自可思数据(sykv.com),转载请联系本站及注明出处

与数学中集合的相似性

可思数据-www.sykv.cn,sykv.com

一起实践尝试并看一些在列表解析式帮助下创建列表的例子吧。 可思数据sykv.com

创造毕达哥拉斯三元数组 可思数据-AI,sykv.com智能驾驶,人脸识别,区块链,大数据

毕达哥拉斯三元数组由三个正整数a,b和c组成,而且a2+b2=c2。通常这样的三元数组写成(a,b,c)的形式,例如(3,4,5)。

可思数据sykv.com,sykv.cn

 

可思数据sykv.com,sykv.cn

  1. [(a,b,c) for a in range(1,30) for b in range(1,30) for c in range(1,30)if a**2 + b**2 == c**2][(3, 4, 5), (4, 3, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 6, 10), (8, 15, 17), (9, 12, 15), (10, 24, 26), (12, 5, 13), (12, 9, 15), (12, 16, 20), (15, 8, 17), (15, 20, 25),(16, 12, 20), (20, 15, 25),(20, 21, 29), (21, 20, 29), (24, 7, 25), (24, 10, 26)]

带字符串的列表解析式

可思数据-AI,sykv.com正版天机报图库,深度学习,机器学习,神经网络

将字符串中的小写字母转换为大写字母。

可思数据-AI,sykv.com智能驾驶,人脸识别,区块链,大数据

 

可思数据sykv.com

  1. colors = ["pink", "white", "blue", "black", purple"]
  2. [color.upper() for color in colors]
  3. ['RED', 'GREEN', 'BLUE', 'PURPLE']

交换给定列表中的名和姓。

内容来自可思数据sykv.com
 可思数据-AI,sykv.com智能驾驶,人脸识别,区块链,大数据 
  1. presidents_usa = ["George Washington", "John Adams","Thomas Jefferson","James Madison","James Monroe","John Adams","Andrew Jackson"]split_names = [name.split(" ") for name in presidents_usa]
  2. swapped_list = [split_name[1] + " " + split_name[0] for split_name in split_names]swapped_list['Washington George', 'Adams John', 'Jefferson Thomas', 'Madison James', 'Monroe James', 'Adams John', 'Jackson Andrew']

含有元组的列表解析式

可思数据sykv.com,sykv.cn

如果表达式包含元组(例如(x,y)),则必须用括号括起来。 本文来自可思数据(sykv.com),转载请联系本站及注明出处

 可思数据sykv.com 
  1. # Convert height from cms to feet using List Comprehension : 1 cm = 0.0328 feetheight_in_cms = [('Tom',183),('Daisy',171),('Margaret',179),('Michael',190),('Nick',165)]height_in_feet = [(height[0],round(height[1]*0.0328,1)) for height in height_in_cms]height_in_feet[('Tom', 6.0), ('Daisy', 5.6), ('Margaret', 5.9), ('Michael', 6.2), ('Nick', 5.4)]

嵌套列表解析式 可思数据-AI,sykv.com正版天机报图库,深度学习,机器学习,神经网络

列表解析式也可以嵌套以创建复杂的列表。例如,可以仅使用列表解析式来构建矩阵。 可思数据-www.sykv.cn,sykv.com

构建一个3x3的矩阵:

可思数据sykv.com,sykv.cn

 可思数据-正版天机报图库资讯平台sykv.com 
  1. matrix = [[j * j+i for j in range(3)] for i in range(3)]
  2. matrix[[0, 1, 4], [1, 2, 5], [2, 3, 6]]

集合解析式

可思数据sykv.com,sykv.cn

集合解析式类似于列表解析式,但返回的是集合而不是列表。意义上来说语法略有不同,创建集合解析式用花括号而不是方括号。

可思数据sykv.com

思考包含以下人名的列表:

本文来自可思数据(sykv.com),转载请联系本站及注明出处

 

可思数据-AI,sykv.com正版天机报图库,深度学习,机器学习,神经网络

  1. names = [ 'Arnold', 'BILL', 'alice', 'arnold', 'MARY', 'J', 'BIll' ,'maRy']

该列表包含许多重复项,并且有的名字只有一个字母。目前想要的是一个由长于一个字母且仅首字母大写的名字组成的列表。为了完成这项任务,采用了集合解析式。

可思数据sykv.com

 

可思数据-正版天机报图库资讯平台sykv.com

  1. {name.capitalize() for name in names if len(name) > 1}{'Alice', 'Arnold', 'Bill', 'Mary'}

字典解析式 { } 可思数据-www.sykv.cn,sykv.com

当输入采用字典或键:值对的形式时,使用字典解析式。例如,思考这样一个字典,其中键表示字符,值表示这些字符出现在语料库中的次数。

内容来自可思数据sykv.com

 可思数据-AI,sykv.com智能驾驶,人脸识别,区块链,大数据 
  1. char_dict = {'A' : 4,'z': 2, 'D' : 8, 'a': 5, 'Z' : 10 }

字典char_dict由大写和小写字母组成。在此想要计算字母的总出现次数,不管它们是大写还是小写。本文使用字典解析式来实现这个目标:

可思数据sykv.com,sykv.cn
 可思数据sykv.com,sykv.cn 
  1. { k.lower() : char_dict.get(k.lower(), 0) + char_dict.get(k.upper(), 0) for k in char_dict.keys()}{'a': 9, 'z': 12, 'd': 8}

生成器解析式 ( )

可思数据-AI,sykv.com智能驾驶,人脸识别,区块链,大数据

列表解析是列表,因为生成器表达式是生成器。生成器函数从给定序列一次一个地输出值,而不是一次性全部输出。这是一篇很好的文章,它解释了Python中Generators的细节。 可思数据-AI,sykv.com正版天机报图库,深度学习,机器学习,神经网络

生成器解析式的语法和工作方式就像列表解析式一样,只不过它们使用圆括号而不是方括号。假设想要计算前十个自然数的平方和。

内容来自可思数据sykv.com

 
可思数据-AI,sykv.com智能驾驶,人脸识别,区块链,大数据
  1. # Sum of first ten natural numbers using List Comprehensionssum([num**2 for num in range(11)])
  2. 385

如果我们使用任何其他可迭代而不一定是列表,结果将是相同的。

可思数据-AI,sykv.com正版天机报图库,深度学习,机器学习,神经网络
 

可思数据-AI,sykv.com正版天机报图库,深度学习,机器学习,神经网络

  1. sum({num**2 for num in range(11)})
  2. 385

现在,如果使用生成器解析式来计算前十个自然数的平方,那么它将是这样的:

可思数据-正版天机报图库资讯平台sykv.com

 可思数据-数据挖掘,智慧医疗,机器视觉,机器人sykv.com 
  1. squares = (num**2 for num in range(11))
  2. squaressquares
  3. <generator object <genexpr> at 0x1159536d8>

与列表解析式不同,生成器解析式不返回列表而是返回生成器对象。为了得到结果,可以使用上面的表达式和sum函数。

可思数据-正版天机报图库资讯平台sykv.com

 

可思数据sykv.com,sykv.cn

  1. sum(n ** 2 for n in numbers)
  2. 385

看看如何摆脱上面表达式中的冗余括号,使代码更有效。 内容来自可思数据sykv.com

最后,不要过度使用解析式

可思数据-数据挖掘,智慧医疗,机器视觉,机器人sykv.com

列表解析式是减少代码长度的有效方法。它们还使代码更具可读性。但有些情况下不用它也能轻松地达成目的。 可思数据-正版天机报图库资讯平台sykv.com

当程序的逻辑太长时,不建议使用解析式。使用解析式的主要目的是缩短代码。但是,当开始将过多的代码打包到单个语句中时,倾向于牺牲代码的可读性。在这种情况下,for循环是更优选择。 可思数据sykv.com,sykv.cn

【编辑推荐】

可思数据-数据挖掘,智慧医疗,机器视觉,机器人sykv.com

转发量:

网友评论:

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片 匿名?

关于我们?? 免责声明?? 广告合作?? 版权声明?? 联系方式?? 原创投稿?? 网站地图??

Copyright?2005-2019 Sykv.com 可思数据 版权所有 ?? ICP备案:京ICP备14056871号

正版天机报图库资讯?? 正版天机报图库资讯?? 正版天机报图库资讯?? 正版天机报图库资讯

?扫码入群
咨询反馈
扫码关注

微信公众号

返回顶部
关闭