zoukankan      html  css  js  c++  java
  • 第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个有效方法》,仅作为个人学习使用,如有侵权请告知,将及时删除,如果觉得有益,请购买原版书籍,知识需要传递和支持,谢谢。 
  • 相关阅读:
    团队冲刺第一阶段第三天
    团队冲刺第一阶段第二天
    团队冲刺第一阶段第一天
    学习进度07
    学习进度06
    结对编程之子数组最大的和(由于一直登不上我的账号,在规定日期内只在我搭档的博客上交了)
    小学四则运算网页版
    团队介绍
    学习进度条05
    111
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/8001736.html
Copyright © 2011-2022 走看看