zoukankan      html  css  js  c++  java
  • python map, reduce,filter 使用

    参考python built-on function:

    http://docs.python.org/2.7/library/functions.html?highlight=map%20reduce

    map(functioniterable...)

    Apply function to every item of iterable and return a list of the results. If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel. If one iterable is shorter than another it is assumed to be extended with None items. If function is None, the identity function is assumed; if there are multiple arguments, map() returns a list consisting of tuples containing the corresponding items from all iterables (a kind of transpose operation). The iterable arguments may be a sequence or any iterable object; the result is always a list.

    >>> def cube(x): return x*x*x 
    >>> map(cube, range(1, 11)) 
    [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

    另外map也支持多个sequence,这就要求function也支持相应数量的参数输入:
    >>> def add(x, y): return x+y 
    >>> map(add, range(8), range(8)) 
    [0, 2, 4, 6, 8, 10, 12, 14]

    reduce(functioniterable[initializer])

    Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the iterable. If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If initializer is not given and iterablecontains only one item, the first item is returned. Roughly equivalent to:

    def reduce(function, iterable, initializer=None):
        it = iter(iterable)
        if initializer is None:
            try:
                initializer = next(it)
            except StopIteration:
                raise TypeError('reduce() of empty sequence with no initial value')
        accum_value = initializer
        for x in it:
            accum_value = function(accum_value, x)
        return accum_value

    reduce(function, sequence, starting_value)对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用,例如可以用来对List求和:
    >>> def add(x,y): return x + y 
    >>> reduce(add, range(1, 11)) 
    55 (注:1+2+3+4+5+6+7+8+9+10)
    >>> reduce(add, range(1, 11), 20) 
    75 (注:1+2+3+4+5+6+7+8+9+10+20)

    又例如:

    a = [1,2,3,4,5]

    reduce(lambda x, y : x +y, a)

    则返回值为:15

    加入我们设定init的值,即:

    a = [1,2,3,4,5]

    reduce(lambda x, y : x +y, a, 3)

    则返回值为:18

    注意:传递给reducefunc,必须要能接受两个参数。并返回一个结果。这个结果将会是传递给func进行下次一调用;上面的例子,调用过程是:

    1,func(1, 2) 返回 x1

    2,func(x1, 3) 返回 x2

    3,func(x2, 4) 返回 x3

    …...

    其实,通过,reducefunc的设计,reduce可以完成mapfilter的功能。

    lambda:这是Python支持一种有趣的语法,它允许你快速定义单行的最小函数,类似与C语言中的宏,这些叫做lambda的函数,是从LISP借用来的,可以用在任何需要函数的地方: 
    >>> g = lambda x: x * 2 
    >>> g(3) 

    >>> (lambda x: x * 2)(3) 
    6

    filter(functioniterable)

    Construct a list from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If iterable is a string or a tuple, the result also has that type; otherwise it is always a list. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed.

    Note that filter(function, iterable) is equivalent to [item for item in iterable if function(item)] if function is not None and [item for item in iterableif item] if function is None.

    See itertools.ifilter() and itertools.ifilterfalse() for iterator versions of this function, including a variation that filters for elements where the function returns false.

    filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回:
    >>> def f(x): return x % 2 != 0 and x % 3 != 0 
    >>> filter(f, range(2, 25)) 
    [5, 7, 11, 13, 17, 19, 23]

    >>> [i for i in range(2,25) if f(i)] 也输出:
    [5, 7, 11, 13, 17, 19, 23]


    >>> def f(x): return x != 'a' 
    >>> filter(f, "abcdef") 
    'bcdef'

    我们也可以把filter map reduce 和lambda结合起来用,函数就可以简单的写成一行。
    例如
    kmpathes = filter(lambda kmpath: kmpath,                  
    map(lambda kmpath: string.strip(kmpath),
    string.split(l, ':')))              
    看起来麻烦,其实就像用语言来描述问题一样,非常优雅。
    对 l 中的所有元素以':'做分割,得出一个列表。对这个列表的每一个元素做字符串strip,形成一个列表。对这个列表的每一个元素做直接返回操作(这个地方可以加上过滤条件限制),最终获得一个字符串被':'分割的列表,列表中的每一个字符串都做了strip,并可以对特殊字符串过滤。

    一句话总结:

    filter很容易理解用于过滤,map用于映射,reduce用于归并。

    lambda表达式返回一个函数对象
    例子:
    func = lambda x,y:x+y
    func相当于下面这个函数
    def func(x,y):
        return x+y
     
    注意def是语句而lambda是表达式
    下面这种情况下就只能用lambda而不能用def
    [(lambda x:x*x)(x) for x in range(1,11)]
     [表达式 for 变量 in 列表 if 条件]
    map,reduce,filter中的function都可以用lambda表达式来生成!

  • 相关阅读:
    左耳听风笔记之一
    富爸爸穷爸爸 -- 笔记
    Aruba无线控制器常用操作
    接入交换机办公网常用配置
    核心交换机办公网常用配置
    FortiGate防火墙办公网常用配置
    去掉深信服上网认证页面里的“修改密码”
    深信服上网行为管理短信认证多用户登录问题
    深信服上网行为管理配置跨三层MAC识别
    深信服上网行为管理实现一次认证成功之后连续3天无流量通过才再次认证
  • 原文地址:https://www.cnblogs.com/youxin/p/3382505.html
Copyright © 2011-2022 走看看