python 中的列表解析和生成表达式
发布时间:2022-01-30 16:14:15
列表解析
在需要改变列表而不是需要新建某列表时,可以使用列表解析。列表解析表达式为:
[expr for iter_var in iterable] [expr for iter_var in iterable if cond_expr]
第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
第二种语法:加入了判断语句,只有满足条件的内容才把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
举例如下:
>>> L= [(x+1,y+1) for x in range(3) for y in range(5)]
>>> L
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
>>> N=[x+10 for x in range(10) if x>5]
>>> N
[16, 17, 18, 19]
生成器表达式
生成器表达式是在python2.4中引入的,当序列过长, 而每次只需要获取一个元素时,应当考虑使用生成器表达式而不是列表解析。生成器表达式的语法和列表解析一样,只不过生成器表达式是被()括起来的,而不是[],如下:
(expr for iter_var in iterable)
(expr for iter_var in iterable if cond_expr)
例:
>>> L= (i + 1 for i in range(10) if i % 2)
>>> L
<generator object <genexpr> at 0xb749a52c>
>>> L1=[]
>>> for i in L:
... L1.append(i)
...
>>> L1
[2, 4, 6, 8, 10]
生成器表达式并不真正创建数字列表, 而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生”(yield)出来。 生成器表达式使用了“惰性计算”(lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调用call by need的方式翻译为惰性更好一些),只有在检索时才被赋值( evaluated),所以在列表比较长的情况下使用内存上更有效。A generator object in python is something like a lazy list. The elements are only evaluated as soon as you iterate over them.
一些说明:
1. 当需要只是执行一个循环的时候尽量使用循环而不是列表解析,这样更符合python提倡的直观性。
for item in sequence:
process(item)
2. 当有内建的操作或者类型能够以更直接的方式实现的,不要使用列表解析。
例如复制一个列表时,使用:L1=list(L)即可,不必使用:
L1=[x for x in L]
3. 如果需要对每个元素都调用并且返回结果时,应使用L1=map(f,L), 而不是 L1=[f(x) for x in L]


猜你喜欢
- try-except作用:处理异常情况用法:try:后面写正常运行的代码,except + 异常情况:后面写对异常情况的处理示例:try:
- 一、前言最近忙里偷闲,做了一个部署数据库及IIS网站站点的WPF应用程序工具。 二、内容此工具的目的是:根据.sql文件在本机上部
- 引言Supabase是一个自称的 "开源Firebase替代品"。我对与Supbase合作已经有一段时间了,我想我将尝试
- 代码 sqrt(x, w=20, Float=False)x 为非负实数,允许科学计数法w 是当sqrt(x)为无理数或结果的小数
- 问题你想反方向迭代一个序列解决方案使用内置的 reversed() 函数,比如:>>> a = [1, 2, 3, 4]&
- vue阻止页面回退的方法如何阻止页面回退?VUE中跳转页面后,阻止返回的方法有很多种,这里就不一一列举,我是用vue-prevent-bro
- 一、显示信息的命令代码如下:<!DOCTYPE html><html><head><title&g
- python有时候需要清除字符串前后空格,而字符本身的空格不需要清除掉,那就不能用正则re.sub来实现。这时用到strip()函数用法:s
- 有一个表,用户需要在后台操作它,希望能对它动态进行添加删除字段。这个功能也许没有问题,但是它原有插入与更新的两个存储过程,也需要一起修改。因
- 目录forEach()方法js中 Array.forEach如何跳出循环解决方式:总结forEach()方法语法:array.forEach
- 近来实验室的师姐要 * 文,由于论文交稿时间临近,有一些杂活儿需要处理,作为实验室资历最浅的一批,我这个实习生也就责无旁贷地帮忙当个下手。今天
- 本文借用HTML的css语法,将样式表应用到窗口部件。这里只是个简单的例子,实际上样式表的语法很丰富。以下类似于css: StyleShee
- 本文实例讲述了python在控制台输出进度条的方法。分享给大家供大家参考。具体实现方法如下:进度条效果如下所示:|#############
- 项目中经常会遇到这样的问题:当某个 js 脚本加载完成后再执行相应任务,但很多朋友可能并不知道怎么判断我们要加载的 js 文件是否加载完成,
- 这篇博客将介绍如何使用Python,Opencv进行二维直方图的计算及绘制(分别用Opencv和Numpy计算),二维直方图可以让我们对不同
- 前言有时候我们需要把图片填充成某个数字的整数倍才能送进模型。例如,有些模型下采样倍率是8倍,或者16倍,那么输入的长和高就分别应该是8或16
- 一、提出问题利用SQL,从右到左查找某一字符串中匹配的查询串的第一个索引位置。比如有一字段ProductName值格式如下:短袖印花T恤 M
- 对于网页制作者来说,最烦琐的事情可能就是给页面中的图片或文字加链接了。假如页面内容很多的话,那么所做的
- 本文实例讲述了Python3.4解释器用法。分享给大家供大家参考,具体如下:Linux/Unix的系统上,Python解释器通常被安装在 /
- 在 Go 里面的协程执行实际上默认是没有严格的先后顺序的。由于 Go 语言 GPM 模型的设计理念,真正执行实际工作的实际上是 GPM 中的