第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个有效方法》,仅作为个人学习使用,如有侵权请告知,将及时删除,如果觉得有益,请购买原版书籍,知识需要传递和支持,谢谢。