Python列表推导和生成器表达式

Python提供了一种精练的写法,可以根据一份列表来制作另外一份,这种称为list comprehension(列表推导)

例如:使用列表中的每个元素的平方生成一个新的列表

alist=[1,2,3,4,5,6,7,8,9,10]

squares=[x**2 for x in alist]

print(squares)

列表推导要比内置的map函数更清晰,如果使用内置函数map,就要创建lambda函数,以便计算新列表中各个元素的值,

squares=map(lambda x: x ** 2,alist)

列表推导不像map那么复杂,可以直接过滤原列表中的元素,使得生成的新列表不会包含对应的计算结果,如计算平方时,只想计算那些可以为2所整除的数。如果采用列表推导来做,那么只需在循环后添加条件表达式即可:

even_squares=[x**2 for x in alist if x%2==0]

print(even_squares)

使用内置的filter和map也能达到同样的效果:

alt=map(lambda x: x**2 ,filter(lambda x : x%2==0,alist))

字典(dict)和集(set)也有和列表类似的推导机制。

使用列表推导比内置的map和filter函数清晰,因为它无需额外编写lambda表达式

例子:

chile_ranks={'ghost':1,'habanero':2,'cayenne':3}

rank_dict={rank:name for name,rank in chile_ranks.items()}
chile_len_set={len(name) for name in rank_dict.values()}
matrix=[[1,2,3],[4,5,6],[7,8,9]]
squared=[[x**2 for x in row] for row in matrix]
a=[1,2,3,4,5,6,7,8,9,10]
b=[x for x in a if x>4 if x%2==0]
c=[x for x in a if x>4 and x%2==0]

print(b,c)

列表推导的缺点:在推导过程中,对输入序列中的每个值来说,可能都要创建公示含一项元素的全新列表,输入数据少时,不会出现问题,如果输入大量数据,那么可能会消耗大量内存,并导致程序崩溃。为了解决这个问题,python提供了生成器表达式(generator expression),生成器表达式在运行的时候,并不会把整个输出序列都呈现出来,而是会估值为迭代器(iterator),这个迭代器每次可以根据生成器表达式产生一项数据。

value=(len(x) for x in open('a.txt'))
print(next(value))
print(next(value))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值