第7条:用列表推导式来取代map和filter

核心知识点:

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

2.列表推导式可以跳过输入列表中的某些元素,如果改用map来做,那就必须辅以filter方能实现。

3.字典与集也支持推导表达式。

 

Python提供了一套精炼的写法,可以根据一份列表里制作另外一份。这种表达式成为列表推倒式。

例如,要用列表中每个元素的平方值来创建另一份列表,可以这样实现:

>>> a = [1,2,3,4,5,6,7,8]
>>> squares = [x**2 for x in a]
>>> print(squares)
[1, 4, 9, 16, 25, 36, 49, 64]

除非是调用只有一个参数的函数,否则,对于简单的情况来说,列表推导要比内置的map函数更清晰。

 

如果使用map就要创建lambda函数,以便计算新列表中各个元素的值,这会使代码看上去比较乱。

>>> squares = map(lambda x:x**2,a)
>>> print(squares)
<map object at 0x0000029BC3251748>
>>> list(squares)
[1, 4, 9, 16, 25, 36, 49, 64]

 

列表推导式不像map那么复杂,可以直接过滤原列表中的元素,使得生成的新列表不会包含对应的计算结果。

例如,在计算平方值时,我们只想计算那些为2所整除的数。如果采用列表推导式,只需要在循环的后面添加条件表达式即可:

>>> even_squares = [x**2 for x in a if x%2 == 0]
>>> print(even_squares)
[4, 16, 36, 64]

 

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

>>> alt = map(lambda x:x**2,filter(lambda x:x%2 ==0,a))
>>> print(alt)
<map object at 0x0000029BC3251908>
>>> list(alt)
[4, 16, 36, 64]

 

字典(dict)与集(set)也有和列表类似的推到机制。例如:

>>> chile_ranks = {'kebi':1,'maoxian':2,'xiaoniao':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)
{1: 'kebi', 2: 'maoxian', 3: 'xiaoniao'}
>>> print(chile_len_set)
{8, 4, 7}

 

关于filter和map的用法可以参考我的博客:http://www.cnblogs.com/yangmingxianshen/p/7764637.html

 

 文章摘抄于Brett Slatkin的《编写高质量Python代码的59个有效方法》,仅作为个人学习使用,如有侵权请告知,将及时删除,如果觉得有益,请购买原版书籍,知识需要传递和支持,谢谢。 
posted @ 2017-12-08 00:52  明王不动心  阅读(1355)  评论(0编辑  收藏  举报