PYTHON列表解析和生成器表达式

1.列表解析:

列表解析,List comprehensions,源自函数式编程语言Haskell,是一个非常有用、简单灵活的工具,可以用来动态创建列表。

列表解析的语法:
[expr for iter_var in iterable]

虽然python中内建函数map()和filter(),lambda等支持函数式编程特征,但是列表解析表达式可以取代内建的这些函数以及lambda,且效率更高。

例如,生成一些平方数。
可以使用map()和lambda:

>>> map(lambda x: x ** 2, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
也可以使用列表解析来替换:

>>> [x ** 2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
使用列表解析,只有一次调用range(),而先前的语句有三次函数调用(range()、map()和lambda)。

另外列表解析还提供了过滤条件,加上if语句:
[expr for iter_var in iterable if cond_expr]

例如,筛选出奇数的平方:

>>> filter(lambda x: (x % 2) ** 2, seq)
[1, 9, 25, 49, 81]
也可以使用列表解析来完成:

>>> [x ** 2 for x in range(10) if x % 2]
[1, 9, 25, 49, 81]
还可以使用列表解析进行嵌套循环:

>>> [(x+1,y+3) for x in range(2) for y in range(3)]
[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)]
还有更多的例子不在此列举了。

2.生成器表达式:
生成器表达式是列表解析的一个扩展。列表解析的不足之处是需要生成所有数据,用以创建整个列表,在有大量数据的情况下,会占用更多的内存空间。
生成器表达式通过结合列表解析和生成器解决了整个问题。

生成器是特定的函数,允许返回一个值,然后“暂停”代码的执行,稍后恢复,使用关键字yield。

生成器表达式,并不真正创建列表,而是返回一个生成器,生成器表达式使用了延迟计算,使得内存使用上更有效。

语法格式:
(expr for iter_var in iterable if cond_expr)

生成器表达式和列表解析格式很相似,只不过生成器表达式返回的是一个生成器。

>>> g = (x ** 2 for x in range(10))
>>> g
<generator object <genexpr> at 0x01AA7F80>

时间: 2024-10-25 22:19:25

PYTHON列表解析和生成器表达式的相关文章

python 中的列表解析和生成表达式_python

列表解析 在需要改变列表而不是需要新建某列表时,可以使用列表解析.列表解析表达式为: [expr for iter_var in iterable] [expr for iter_var in iterable if cond_expr] 第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表. 第二种语法:加入了判断语句,只有满足条件的内容才把iterable里

python 列表解析问题

问题描述 有一个python列表如下面格式:alist= [('type', 'hidden'), ('name', 'NXX'), ('id', 'IDXX'), ('value', 'VXX')] 要求解析出到一个字典中adict={'NXX','VXX'},字典的key为列表中('name', 'NXX')的NXX,字典的value为列表中的('value', 'VXX')的VXX要求pythonic,最好是一行代码搞定 解决方案 adict[alist[1][1]]=alist[2][1

《编写高质量Python代码的59个有效方法》——第9条:用生成器表达式来改写数据量较大的列表推导

第9条:用生成器表达式来改写数据量较大的列表推导 列表推导(参见本书第7条)的缺点是:在推导过程中,对于输入序列中的每个值来说,可能都要创建仅含一项元素的全新列表.当输入的数据比较少时,不会出问题,但如果输入的数据非常多,那么可能会消耗大量内存,并导致程序崩溃. 例如,要读取一份文件并返回每行的字符数.若采用列表推导来做,则需把文件每一行的长度都保存在内存中.如果这个文件特别大,或是通过无休止的network socket(网络套接字)来读取,那么这种列表推导就会出问题.下面的这段列表推导代码,

Python 进阶_迭代器 &amp;amp; 列表解析

目录 目录 迭代器 iter 内建的迭代器生成函数 迭代器在 for 循环中 迭代器与字典 迭代器与文件 创建迭代器对象 创建迭代对象并实现委托迭代 迭代器的多次迭代 列表解析 列表解析的样例 列表解析和迭代器 迭代器 迭代器是一个含有 next() 方法的对象,让我们可以迭代不是序列数据类型但表现出序列行为的对象,所以可以说迭代器为类序列对象提供了一个类序列的接口(只要是实现了 __iter__() 方法的对象,就可以使用迭代器来进行访问).迭代器从对象的第一个元素开始访问,直到所有的元素被遍

Python列表list数组array用法实例解析_python

本文以实例形式详细讲述了Python列表list数组array用法.分享给大家供大家参考.具体如下: Python中的列表(list)类似于C#中的可变数组(ArrayList),用于顺序存储结构.   创建列表   复制代码 代码如下: sample_list = ['a',1,('a','b')]   Python 列表操作 复制代码 代码如下: sample_list = ['a','b',0,1,3]   得到列表中的某一个值 复制代码 代码如下: value_start = sampl

详解Python的迭代器、生成器以及相关的itertools包_python

对数学家来说,Python这门语言有着很多吸引他们的地方.举几个例子:对于tuple.lists以及sets等容器的支持,使用与传统数学类似的符号标记方式,还有列表推导式这样与数学中集合推导式和集的结构式(set-builder notation)很相似的语法结构. 另外一些很吸引数学爱好者的特性是Python中的iterator(迭代器).generator(生成器)以及相关的itertools包.这些工具帮助人们能够很轻松的写出处理诸如无穷序列(infinite sequence).随机过程

Python列表(list)

序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法. 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 创建列表 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可 list = [1, 2, 3, 4, 5 ] 访问列表中的值 使用下标索引来访问列表中的值,同样你也可以使用方括号的形式截取字符.这个与

Python 列表(List)操作方法详解_python

列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有相同的类型.列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推.Python有6个序列的内置类型,但最常见的是列表和元组.序列都可以进行的操作包括索引,切片,加,乘,检查成员.此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法. 一.创建一个列表只要把逗号分隔的不同的数据项使用方括号括起来即可.如下所示: 复制代码 代码如下: list1

python的迭代器与生成器实例详解_python

本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述:  迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.  1.1 使用迭代器的优点  对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法随机访问的数据结构(比如se