每日10行代码90:编写高质量python代码方法7——用列表推导来取代map和filter

python提供了一种精练的写法,可以根据一份列表来制作另外一份。这种表达式称为list comprehension(列表推导)。例如,要用列表中每个元素的平方值构建成另一份列表。如果采用列表推导式来实现,那么就是如下这样的:

a = [1,2,3,4,5,6,7,8,9,10]
squares = [x**2 for x in a] 
print(squares)

除非是调用只有一个参数的函数,否则,对于简单的情况来说,列表推导要比内置的map函数更清晰。在这个例子中,如果使用map,那就要创建lammbda函数,以便计算新列表中各个元素的值,这会使代码看起来有些乱。

squares = map(lambda x:x**2,a)
print(list(squares))

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

even_squares = [x**2 for x in a if x %2 == 0]
print(even_squares)

输出结果:

[4, 16, 36, 64, 100]

使用内置的filter函数与map结合起来,也能达到同样的效果,但是代码会写的非常难懂。

alt = map(lambda x:x**2,filter(lambda x:x%2 == 0,a))
assert even_squares == list(alt)

字典与集合,也有和列表类似的推导机制,编写算法时,可以通过这些推导机制来创建衍生的数据结构。

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()}  
print(rank_dict)
print(chile_len_set)

输出结果:

{1: 'ghost', 2: 'habanero', 3: 'cayenne'}
{8, 5, 7}

要点:

  1. 列表推导要比内置的map和filter函数清晰,因为它无需额外编写lambda表达式。
  2. 列表推导可以路过输入列表中的某些元素,如果改用map来做,那就必须辅以filter方能实现。
  3. 字典与集也支持推导表达式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值